bashの変数に入れ子になったコマンドの出力を割り当てることはできません。

bashの変数に入れ子になったコマンドの出力を割り当てることはできません。

ファイルから任意の行を選択する次のコマンドを変数に割り当てようとしましたが、機能しません。

givinv@87-109:~$ head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1
cower
givinv@87-109:~$

以下は、変数に割り当てようとしたときに発生するエラーです。

givinv@87-109:~$ VARIA=`head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1`
bash: command substitution: line 1: unexpected EOF while looking for matching `)'
bash: command substitution: line 2: syntax error: unexpected end of file
bash: command substitution: line 1: syntax error near unexpected token `)'
bash: command substitution: line 1: ` + 1)) file | tail -1'
-l: command not found
givinv@87-109:~$

同じforループを試しましたが、うまくいきませんでした。

givinv@87-109:~$ for i in `head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1`;do echo $i ;done
bash: syntax error near unexpected token `<'
givinv@87-109:~$ 

ベストアンサー1

エスケープされていないバックティックをネストしようとしているため、機能しません。

VARIA=`head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1`

head -$((${RANDOM} %実際には、最初に単一のコマンドで実行しようとします。これにより、2つの最初のエラーが発生します。

$ VARIA=`head -$((${RANDOM} % `
bash: command substitution: line 1: unexpected EOF while looking for matching `)'
bash: command substitution: line 2: syntax error: unexpected end of file

その後、実行を試みます。

wc -l < file` + 1)) file | tail -1`

これは+ 1)) file | tail -1、バックティック間で評価を試み、次のエラーが発生することを意味します。

$ wc -l < file` + 1)) file | tail -1`
bash: command substitution: line 1: syntax error near unexpected token `)'
bash: command substitution: line 1: ` + 1)) file | tail -1'

バックティックをエスケープすることでこの問題を解決できます。

VARIA=`head -$((${RANDOM} % \`wc -l < file\` + 1)) file | tail -1`

しかし、通常、バックティックをまったく使用しないことが最善です。ほとんど常にこれを使用する必要があります$()。より強力でより簡単な構文を使用して、無限に入れ子にすることができます。

VARIA=$(head -$((${RANDOM} % $(wc -l < file) + 1)) file | tail -1)

おすすめ記事