「$i|sed」が機能しないのはなぜですか?

「$i|sed」が機能しないのはなぜですか?

私はこのコードを持っています:

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%/}最後から$iaを削除します。/

$ 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の引数を引用する必要があります。

関連情報