ユーザーの対話が必要なスクリプトを作成しようとしています。デフォルトでは、スクリプトはユーザーに3つのパラメーター、つまりユーザーが見つけたいファイル名、ファイルが変更されてからの日数、tarアーカイブ名を要求する必要があります。すべてのパラメータがわかったら、スクリプトは適切なファイルを見つけて、指定された名前のアーカイブに配置する必要があります。端末に単一のコマンドを書くとき:
find -name 'zad*' -mtime -10 | tar -cvf archive.tar.gz -T -
良い結果。ユーザーが入力した変数を使用して同じスクリプトからコマンドを呼び出すにはどうすればよいですか?私のスクリプトは空のアーカイブを作成しています。
私のスクリプト:
echo "Enter a number of days"
read days
echo "Enter the name of file"
read nameoffile
echo "Enter the name of tar archive"
read nameofarchive
find -name '"$nameoffile"' -mtime -"$days" | tar -cvf "$nameofarchive".tar.gz -T -
答え1
'
余分な引用符を削除してみてください'"$nameoffile"'
例:
maulinglawns@debian-HP:~$ read nameoffile
myFile
maulinglawns@debian-HP:~$ echo '"$nameoffile"'
"$nameoffile"
maulinglawns@debian-HP:~$ echo "$nameoffile"
myFile
一重引用符が必要な場合は、次のようにエスケープしてください。
echo \'$nameoffile\'
'myFile'
答え2
一般に、ユーザーの対話を要求するのは非常に悪い考えです。これにより、スクリプトを自動化できなくなり、タブの完成が許可されていない環境でユーザーが手動で入力する必要があるため、ユーザーは使用しにくくなります。
@maulinglawnsの後すでに説明していますスクリプトが失敗するのはなぜですか?ユーザーが苦労して情報を入力する必要のない簡単な方法を提供します。
#!/usr/bin/env sh
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
その後、過去3日間に変更された名前のファイルを見つけてfoo.txt
bar.tar.gz`に保存するには、次のようにします。
script.sh 3 foo.txt bar
スクリプトが常に正しい数の引数で実行されていることを確認するために、いくつかの簡単なエラーチェックを追加することもできます。
#!/usr/bin/env sh
if [ $# -ne 3 ]; then
echo "You need to enter three arguments"
exit 1
fi
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
答え3
たとえば、readは名前付き変数をサポートします。
#!/bin/bash
read -p "How many files? (0-100) " VAR_NUMBER_OF_FILES
read -p "How many days? (0-100) " VAR_NUMBER_OF_DAYS
read -p "Tar file name? " VAR_TAR_NAME
...
find -name '"$VAR_NUMBER_OF_FILES"' -mtime -"$VAR_NUMBER_OF_DAYS" | tar -cvf "$VAR_TAR_NAME".tar.gz -T -