2016-12-20 2 views
0

ユーザ応答に基づいてファイルをコピーするシェルスクリプトを作成しようとしています。私がやろうとしていることの例:Bash - ファイルまたはディレクトリをコピーするための応答を読み取る

#!/bin/bash 
echo "What is the name of the user?: " 
read RESPONSE 
cp /home/$RESPONSE/file.txt /home/$RESPONSE/backup/file_backup.txt 

しかし、私のコピーコマンドは読み込み変数を正しく受け入れていないようです。 私は何が間違っていますか?

+2

* *正確に*間違っていますか?ユーザー名にスペースやリテラルのバックスラッシュがある場合、またはグロブとして評価できる場合、バグはかなり明白ですが、観察された*正確な動作についてより具体的に説明する必要があります。 "受け入れていないようだ" - どうやって知っていますか?正確な入力と出力の正確なエラーは何ですか? –

+1

'bash -x yourscript'を実行して、呼び出されたコマンドのロギングを実行することを検討してください。また、http://shellcheck.net/を介して実行し、見つかったものを修正します(これは、ここでシェルの質問をする前に常に良いアドバイスです)。 –

+0

また、自分の変数にはすべて大文字の名前を使用しないでください!すべての大文字の名前は、オペレーティングシステムやシェルに意味を持つ変数によって使用されます。小文字の名前を使用すると、間違ってそれらを踏むことはありません。 [関連標準のドキュメント](http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html)のパラグラフ4を参照してください(環境変数について議論していますが、通常のシェル変数を設定すると、という名前の環境変数であるため、両方の場所で規約が適用されます)。 –

答えて

0

私は問題を把握しました。私はその間にいくつかのコマンドを持っていて、必要ではなかった2番目に読んだRESPONSEコマンドを持っていました。それは右、私が必要としていたGeorgeVasiliou @

また
#!/bin/bash 
echo "What is the name of the user?: " 
read RESPONSE 
rsync -a /home/$RESPONSE /backup 
read RESPONSE 
cp /home/$RESPONSE/file.txt /home/$RESPONSE/backup/file_backup.txt 

は、また引用符でそれを含める:他の言葉では、一例として、私はこれを持っていました。どのように動作します:

#!/bin/bash 
echo "What is the name of the user?: " 
read response 
rsync -a "/home/$response/" /backup 
cp "/home/$response/file.txt" "/home/$response/backup/file_backup.txt" 
+0

スクリプトをすべて実行する前に、ユーザーとバックアップフォルダが存在するかどうかを確認して、スクリプトをチェックする方がよいでしょう。私の答えを見てください。 –

+0

将来的には、あなたの質問の簡略化されたコードが、再生装置を作成しようとしている実際のプログラムと同じ問題を持っていることを確認してください。 –

0

次のコードは、あなたが望むものを実現します。また、ユーザーが存在するかどうかを確認し、ファイルを保存する前に/ backup/folderを作成した場合(ユーザーが存在しない場合は/ home/user/...も存在しないはずです。スクリプトが失敗する)。

#!/bin/bash 

echo "What is the name of the user?: " 
read response 
checkuser1="$(getent passwd | cut -d: -f1 | grep -si "$response")" 
if [ -z "$checkuser1" ]; then echo "No user with this name has been located!"; exit; fi 
if [ ! -d /home/"$response"/backup/ ]; then echo "This user has not created the /home/"$response"/backup/ folder yet!"; exit; fi 
cp /home/"$response"/file.txt /home/"$response"/backup/file_backup.txt 
exit 

編集:上記のコードは、いくつかの改善点を追加して編集されました。

+0

ニース。私はそれが好きです。ありがとう。 – t3kg33k

+0

'/ etc/passwd'を直接参照するのではなく、' getent passwd'を使うことをお勧めします。これは、ローカルファイル認証に限定されるのではなく、NIS、LDAP、のみ。また、エラーケースに対してゼロ以外の終了ステータスを明示的に指定することもできます。 (誤っていない場合は、これとは対照的に、最後のコマンドの状態で終了するデフォルトの動作( 'cp'の動作)はおそらく正しいものです;明示的な' exit 0'を入れることで、 'cp'が失敗しても正常終了ステータス)。 –

+0

チャールズありがとう!私は 'ゲント(getent) 'が大好きです。また、最終的な「終了」はゼロに設定しないでください。私は非常に初心者のユーザーのためにたくさんの開発をしました(初心者はダブルクリックの仕方がわかりません!)、通常はコードをできるだけ静かにします。ちょうど習慣ですが、ここで定期的に「退出」する方がはるかに優れています。私は答えを決めた。 –

関連する問題