私はこのコードを持っています:
if [ $i | sed -e "s/^.*\(.\)$/\1/" = "/" ]
then
echo "folder"
else
echo "file"
fi
$i
そんなところはどこですか
app4/
上記のコードは文字列の最後の文字を取得し、それがスラッシュ(/
)であることを確認するようになっていますが、次のような内容を教えてくれます。
./str: 行 12:=app4/: ファイルまたはディレクトリが存在しません。
この問題をどのように解決できますか?
答え1
$i
実行したい正確なコマンドを表示するには、in値を変更できます。
app4/ | sed -e "s/^.*\(.\)$/\1/"
app4/
コマンドではないため動作しません。入力をパイプしようapp4/
としているので、sed
出力を使用する必要がありますapp4/
。
echo app4/ | sed -e "s/^.*\(.\)$/\1/"
sed
これは機能しますが、実際にこれに使用する必要はありません。bash
文字列操作ツールがたくさんあります。たとえば、${i#}
長さを提供し$i
、${i:j}
最初から部分文字列を提供するので、j
最後の${i:$((${i#}-1))}
文字を提供します。
あなたが試すことを達成する最も簡単な方法は、おそらく次のものを使用することです。これは返されますが、${i%/}
最後から$i
aを削除します。/
$ i="app4"; echo ${i%/}
app4
$ i="app4/"; echo ${i%/}
app4
したがって:
if [ "${i%/}" = "$i" ]
then
echo "file"
else
echo "folder"
fi
しかし、本物$i
有効なディレクトリであることを確認するには、次のものを使用できます。
if [ -d "$i" ]
答え2
変数が/で終わるかどうかを確認する最も簡単な方法は次のとおりです。
[[ $i = */ ]]
..Johanが言ったように存在することを確認し、存在しない場合は作成できます。ただし、次のように正しく引用する必要があります。
if [[ ! -d $i ]]; then
mkdir -p "$i" || exit 1
fi
[[ .. ]] 内部の拡張を引用する必要はありません。拡張は、より大きな実用性とスピードで使用を容易にします。 mkdirの引数を引用する必要があります。