Bashスクリプトは変数を実行しようとします。

Bashスクリプトは変数を実行しようとします。

次のような非常に短い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 foundbashがコマンド「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 3bash に表示されます。

if command ;then do-something; fiifテストされた終了コードのため問題ありません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

関連情報