web-dev-qa-db-ja.com

ファイル内のエコーはそのようなファイルまたはディレクトリを返しません

なぜ私の単純なスクリプトが機能しないのか疑問に思っています。

#!/usr/bin/env bash
user_variable='$1'
echo "export USER_VAR=$user_variable" > ~$user_variable/.filename

スクリプトを起動すると、次のエラーが発生します。

./script.sh admin: line 3: ~admin/.filename: No such file or directory 

もちろん、〜adminのディレクトリは存在します:

~ # cd ~admin
/share/homes/admin #

そして、この種のコマンドをコマンドラインで直接テストすると、次のように機能します。

# echo "test" > ~admin/.filetest
#

では、なぜ私のエコーコマンドがスクリプトファイルで機能しないのですか?

ありがとうございました。

3
mickaelb91

bash(1)から:

展開の順序は、ブレース展開、チルダ展開、パラメーター、変数および算術展開、およびコマンド置換(左から右に実行)、単語分割、およびパス名展開です。

つまり、変数展開の前にチルダ展開を行うため、試行して失敗するまで、$user_variable$1(これは「admin」だと思います)に置き換えません。 ~を処理する–「admin」という名前のユーザーではなく「$user_variable」という名前のユーザーを探しているため。

ここでの展開の順序は、本来の意図に従って変数を使用することを妨げるものではありません。通常evalは、動的コマンドに関して役立ちます。

eval "echo \" export USER_VAR = $ user_variable\">〜$ user_variable/.filename"

0
Gombai Sándor