Nasıl bash komut satırı argümanları ayrıştırmak mı?
Bu hat ile çağrılan bir senaryo var ki:
./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile
ya da bu:
./myscript -v -f -d -o /fizz/someOtherFile ./foo/bar/someFile
Ne şekilde kabul ayrıştırma bu şekilde her durumda (veya ikisinin birleşimi) $v
, $f
$d
Tüm ayarlanmış true ve $outFile
olacak eşit /fizz/someOtherFile
?
CEVAP
Tercih edilen Yöntem: getopt[s] Kullanmadan düz bash
Ben aslında OP sorulan her soruya cevap verdi. Bu S/A ilgi çok oluyor, ayrıca bunu yapmak için büyü dışı şekilde teklif etmeliyim. guneysus's answer üzerine kötü sed düzeltme ve Tobias Kienzler's suggestion içerecek şekilde genişletmek için gidiyorum.
Anahtar değer çifti bağımsız değişkenleri geçirmek için en yaygın yolu iki:
Düz Bash Boşlukla Ayrılmış
Kullanımı 12**
#!/bin/bash
# Use > 1 to consume two arguments per pass in the loop (e.g. each
# argument has a corresponding value to go with it).
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
# note: if this is set to > 0 the /etc/hosts part is not recognized ( may be a bug )
while [[ $# > 1 ]]
do
key="$1"
case $key in
-e|--extension)
EXTENSION="$2"
shift # past argument
;;
-s|--searchpath)
SEARCHPATH="$2"
shift # past argument
;;
-l|--lib)
LIBPATH="$2"
shift # past argument
;;
--default)
DEFAULT=YES
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
echo FILE EXTENSION = "${EXTENSION}"
echo SEARCH PATH = "${SEARCHPATH}"
echo LIBRARY PATH = "${LIBPATH}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
echo "Last line of file specified as non-opt/last argument:"
tail -1 $1
fi
Düz Bash Ayrılmış Eşittir
#!/bin/bash
for i in "$@"
do
case $i in
-e=*|--extension=*)
EXTENSION="${i#*=}"
shift # past argument=value
;;
-s=*|--searchpath=*)
SEARCHPATH="${i#*=}"
shift # past argument=value
;;
-l=*|--lib=*)
LIBPATH="${i#*=}"
shift # past argument=value
;;
--default)
DEFAULT=YES
shift # past argument with no value
;;
*)
# unknown option
;;
esac
done
echo "FILE EXTENSION = ${EXTENSION}"
echo "SEARCH PATH = ${SEARCHPATH}"
echo "LIBRARY PATH = ${LIBPATH}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
echo "Last line of file specified as non-opt/last argument:"
tail -1 $1
fi
Daha iyi "this guide." Alt Temizleme için ${i#*=}
arama anlamak için İşlevsel olarak gereksiz bir alt süreci `echo "$i" | sed 's/[^=]*=//'`
aramalar `sed 's/[^=]*=//' <<< "$i"`
eşdeğerdirikigereksiz alt işlemler.
Kullanarak getopt[s]
kimden: http://mywiki.wooledge.org/BashFAQ/035#getopts
Hiç getopt(1) kullanın.getopt
boş argümanlar ele gömülü boşluk içeren dizeler, ya da bağımsız olamaz. Onun varlığını unutma lütfen.
POSIX kabuk (ve diğerleri) yerine kullanmak için güvenli getopts
sunuyoruz. Burada getopts
basit bir örnek:
#!/bin/sh
# A POSIX variable
OPTIND=1 # Reset in case getopts has been used previously in the shell.
# Initialize our own variables:
output_file=""
verbose=0
while getopts "h?vf:" opt; do
case "$opt" in
h|\?)
show_help
exit 0
;;
v) verbose=1
;;
f) output_file=$OPTARG
;;
esac
done
shift $((OPTIND-1))
[ "$1" = "--" ] && shift
echo "verbose=$verbose, output_file='$output_file', Leftovers: $@"
# End of file
getopts
avantajları:
- Taşınabilir, örneğin çizgi çalışacak.
- Beklenen Unıx şekilde
-vf filename
gibi şeyler, otomatik olarak işleyebilir.
getopts
dezavantajı kısa seçenekleri (-h
, --help
) hile olmadan işleyebilir.
Sözdizimi ve tüm değişkenleri demek istediğini açıklıyor getopts tutorial var. Bash da bilgilendirici olabilir help getopts
var.
Nasıl komisyon bir görev için komut sa...
Nasıl bir metin dosyasının ilk satırı ...
Nasıl komut satırı argüman bash bir ko...
Nasıl Eclipse komut satırı argümanları...
bash komut satırı argümanları...