次のような非常に短いBashスクリプトがあります。
variable="3 things"
if $(echo $variable|grep "^[0-9]\{1,\}") #if $variable begins with [0-9]
then
echo $(echo $variable|sed 's/ .*$//')
else
echo "0"
fi
$variable
結局のところ、コマンドの出力は数字または「いいえ」という単語で始まる文字列になります。スクリプトに数字のみを返し、そうでない場合は数字0を返します。
エラーが発生し、script.bash: line 2: 3: command not found
bashがコマンド「3」を実行しようとしている理由を理解できません。どんな洞察力にも感謝します(またはこれを書くためのより良い方法の提案 - 私はbashスクリプトに精通していません)。
ありがとう
答え1
この試み:
variable="3 things"
if echo "$variable" | grep "^[0-9]\{1,\}" >/dev/null 2>&1 #if $variable begins with [0-9]
then
echo "$variable" | sed 's/ .*$//'
else
echo "0"
fi
この$(...)
シンボルを使用すると、内部コマンドを実行し、そのコマンドの出力をその場所に配置します。このコマンドはif
このコマンドの出力を実行し、成功したことを確認します。この場合、実際には$(...)
。
答え2
あなたのスクリプトは実行しようとしません。変える。
「grep」の出力を実行しようとしています...
そうしたい理由サム、if command
スクリプトで発生したのと同じ理由です。このコマンドはif
..を介して終了コードを実行してテストします。 grep 出力がif 3
bash に表示されます。
if command ;then do-something; fi
if
テストされた終了コードのため問題ありませんcommand
。コマンドではない
if 3 ; then do-somethin; fi
ので失敗します3
...これはこれを示す簡単な例です。if command...
function error() { return 1 ; }
if error ;then echo A-cond1 ; else echo A-cond2 ;fi
if echo -n;then echo B-cond1 ; else echo B-cond2 ;fi
# `if 3` fails as you already know..
# output:
A-cond2
B-cond1
これらすべてを簡単に防ぎ、「sed」が条件付きテストと出力を処理できるようにします。
for var in \
"3 things" \
" 1 leading space" \
"10 green bottles" \
"albatross"
do
echo "$var" |sed -e "s/^\([0-9]\+\).*/\1/" \
-e "s/^[^0-9].*/0/"
done
出力:
3
0
10
0