2つの変数でユーザーから入力を受け取るスクリプトがあります。次に、ifの条件に入力されたコマンドでこれらの変数を使用しようとします。しかし、ユーザー入力値が私の変数を置き換えないため、私のコマンドは機能しません。
# Get acl and dc values
echo "Type the ACL name:"
read acl
echo "Type the DATACENTER name"
read dc
# see if sw-list-cisco file exists in ~/$acl directory"
if [ ` ls -1 ~/$acl/sw-list-cisco > /dev/null | wc -l ` -gt 0 ];
then
echo "Going to do something"
else
echo "no match !!!!!!!!!!!!!"
fi
条件 このif [ ` ls -1 ~/"$acl"/sw-list-cisco > /dev/null | wc -l ` -gt 0 ];
$acl をユーザー入力値に置き換えないようです。sw-list-cisco
ディレクトリに存在するかどうかを手動で確認しました~/$acl
。私は何を見逃していますか?
答え1
この場合、次のようにしてこれを行うことができます。
if [ -f "$HOME/$acl/sw-list-cisco" ]; then
-f
指定された名前が存在し、通常のファイルの名前であるかどうかをテストするためにテストを使用しています。$HOME
代わりに使用しています~
。~
引用符内の変数ではありません(もう少し$HOME
説明すると、IMHO)。
答え2
if [ ` ls -1 ~/$acl/sw-list-cisco > /dev/null | wc -l ` -gt 0 ];
ls
/dev/null
何も起こらないように出力をにリダイレクトし、wc
常に印刷します0
。手動で試してls / >/dev/null | wc -l
もls / | wc -l
同じです。
リダイレクトしたい場合もあります。間違いからにls
変更/dev/null
:
if [ $(ls ~/"$acl/sw-list-cisco" 2>/dev/null | wc -l) -gt 0 ];
(-1
出力がパイプに入る場合は必要ありません。)
でもファイルなので[ -f ~/"$acl/sw-list-cisco" ]
簡単にできます@Kusalanandaがすでに返信しました。。ファイル数を数えたい場合でも、globを配列に拡張して要素数を数えることをお勧めします。