BSDから完全なLinuxに移行しています。 Ubuntu 16.04のスクリプト
#!/bin/sh
while (( "$#" )); do
case "$1" in
-i | --ignore-case)
[ $# -ne 2 ] && echo "2 arguments i needed" && exit 1
case_option=-i
;;
-*)
echo "Error: Unknown option: $1" >&2
exit 1
;;
*) # No more options
break
;;
esac
shift
done
# -o, if not, then ...
find $HOME ! -readable -prune -o \
-type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -R -
エラーはループにあります。
sh ./script masi
期待した出力と同じ出力を返します。- ランニング
sh ./script -i masi
。出力:空のファイル。期待される出力:結果のリスト。スタウトは./script: 2: ./script: 2: not found Vim: Reading from stdin...
。
考えられるエラー
while (( "$#" ))
- ...
何らかの理由でこのオプションはまったく使用できません。
getoptsに行きたい動機 - Terdonの答え
case_option=""
while getopts "i:" opt; do
case $opt in
i | ignore_case)
[[ $# -ne 2 ] && echo "2 arguments i needed" && exit 1
case_option=-i
;;
-*)
echo "Error: Unknown option: $1" >&2
exit 1
;;
*) # No more options
break
;;
esac
done
find $HOME ! -readable -prune -o \
-type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -R -
どこ
./script masi
または電話で./script -i masi
。
while
ケースを繰り返す方法は?
ベストアンサー1
dash
sh
orの代わりにandを使用して実行するため失敗しますbash
。 Ubuntuは、最小限のPOSIX互換シェルである/bin/sh
シンボリックリンクです。/bin/dash
最も簡単な解決策はスクリプトを実行することですが、期待bash
どおりに機能しません。
bash ./script masi
また、シェバンラインがあることに注意してください。
#!/bin/sh
つまり、実行する必要はなく、sh ./script
実行するだけです./script
。代わりに、bashを指すようにshebang行を変更してくださいsh
。
#/bin/bash
sh
(Ubuntuで)頑固な場合は、ループを次のように変更するdash
必要があります。while
while [ "$#" -gt 0 ]; do
または、次のことを見たいと思うかもしれません。getopts
。