str1="ace"
str2="com"
str3="ros"
$name = readinput(Enter name:)
if [[ "$name" == "$str1" ]];
then
run ace.txt
else
if [[ "$name" == "$str2" ]];
then
run commscope.txt
else
if [[ "$name" == "$str3" ]];
then
run rosgenberger.txt
else
echo "no match found"
fi
fi
fi
スクリプトは実行されません。助けてください。私が望む行動は次のとおりです。
- ユーザー入力が「ace」の場合、---ace.txtを実行する必要があります。
- ユーザー入力が「com」の場合、---commscope.txtを実行する必要があります。
- ユーザー入力が「ros」の場合、---run rosgenberger.txtを実行する必要があります。
ace.txt/commscope.txt/rosgenberger.txt スクリプトがあるパスでこのスクリプトを実行します。
ベストアンサー1
次の操作を実行できます。
#!/bin/sh
printf 'Enter name: ' >&2
read -r name
case $name in
ace)
run ace.txt
;;
com)
run commscope.txt
;;
ros)
run rosgenberger.txt
;;
*)
printf 'No match for "%s"\n' "$name"
esac
ユーザーから「名前」を読み、ユーザーの応答に応じてコマンドを実行します。
bash
シェルでは、より簡素化された方法を使用できます。
#!/bin/bash
declare -A map=(
[ace]=ace.txt
[com]=commscope.txt
[ros]=rosgenberger.txt
)
read -p 'Enter name: ' -r name
if [[ -n ${map[$name]} ]]; then
run "${map[$name]}"
else
printf 'No match for "%s"\n' "$name"
fi
これにより、期待される「名前」をキーに、対応するファイル名を値として連想配列を設定します。ユーザーの入力に応じて、コマンドは正しいファイル名を使用しますrun
。
ただし、ほとんどの場合、ユーザーと対話したくなく、代わりにユーザーがコマンドラインオプションを介して入力を簡単に提供できるようにします。以下は、コマンドラインを介して渡された最初の引数をデフォルトとして使用して、入力の対話型プロンプトをバイパスしますname
。
#!/bin/bash
name=$1
declare -A map=(
[ace]=ace.txt
[com]=commscope.txt
[ros]=rosgenberger.txt
)
if [[ -z $name ]]; then
read -p 'Enter name: ' -r name
fi
if [[ -n ${map[$name]} ]]; then
run "${map[$name]}"
else
printf 'No match for "%s"\n' "$name"
fi
これは次のように使用されます。
./myscript ace
...例えば。これにより、スクリプトはインタラクティブな質問をバイパスして実行されますrun ace.txt
。
run
コマンドに必要な変数拡張を使用してエラー報告を完了することで、コードをさらに簡素化できます。
#!/bin/bash
name=$1
declare -A map=(
[ace]=ace.txt
[com]=commscope.txt
[ros]=rosgenberger.txt
)
if [[ -z $name ]]; then
read -p 'Enter name: ' -r name
fi
run "${map[$name]?Name $name not matched}"
これは次のように出力されます
line 15: map[$name]: Name Boo not matched
ユーザーが名前を入力した場合Boo
。