単純なbashスクリプトが機能しない

単純なbashスクリプトが機能しない

このスクリプトは、コマンドラインから引数として名前が付けられたすべてのファイルをユーザーのホームディレクトリにコピーする必要があります。ファイルが提供されていない場合、スクリプトは読み取りを使用してファイル名を要求し、応答に指定されたすべてのファイル名をユーザーのホームディレクトリにコピーする必要があります。

if [ -z $1 ]
then
    echo provide filenames
    read $FILENAMES
else
    FILENAMES="$@"
fi

echo the following filenames have been provided: $FILENAMES
for i in $FILENAMES
do
    cp $i $HOME
done

文字列形式でパラメータを指定すると機能します。しかし、「$ FILENAMESを読む」を提供しても機能しません。

講師は自分のコースで同じ解決策を示しましたが、どのように機能するかは示していません。 ここに画像の説明を入力してください。

更新ファイル名をパラメーターとして入力した後、空の文字列が提供され、ファイルが$ HOMEの場所にコピーされませんでした。

[dmytro@oc1726036122 ~]$ cd Desktop/
[dmytro@oc1726036122 Desktop]$ . totmp 
provide filenames
one two
the following filenames have been provided:
the following filenames have been provided:
[dmytro@oc1726036122 Desktop]$

ベストアンサー1

read変数を読むのではなく宣言してください。一言で$内容を削除するだけreadです。

if [ -z $1 ]
then
    echo provide filenames
    read FILENAMES
else
    FILENAMES="$@"
fi

echo the following filenames have been provided: $FILENAMES
for i in $FILENAMES
do
    cp $i $HOME
done

source編集:(.)コマンドを使用してスクリプトを実行することを確認しました。

[dmytro@oc1726036122 Desktop]$ . totmp

この特定のスクリプトには問題ありませんが、複雑なスクリプトには絶対にこれを実行しないでください。それ以外の場合は、スクリプト内のすべての変数または関数をシェルにインポートします。ただ使用bash totmp

おすすめ記事