4

bashスクリプトで、実行されているディレクトリの名前を確認したいと思います。何かのようなもの:

#!/bin/bash

path=eval 'pwd'

dirname=eval 'basename $path'

しかし、それは機能しません:私は得る

./foo.sh: line 5: basename $path: command not found

どうすれば修正できますか?また、dirnameに正しいdirnameが含まれるようになったら、それを小文字に変換してテストします。これは、コマンドラインでawkを使用して実行できます。

echo $dirname | awk '{print tolower($0)}'

しかし、どうすれば戻り値を変数に取り込むことができますか?

4

7 に答える 7

3

使用しない理由:

#!/bin/bash

path=`pwd`
dirname=`basename $path | awk '{print tolower($0)}'`

または、ワンライナーとしてそれを行いたい場合:

dirname=`pwd | xargs basename | awk '{print tolower($0)}'`
于 2012-10-02T12:21:18.317 に答える
2

あなたはそれを書き直すことができます

dirname=eval "basename $path"

一重引用符を使用すると、シェルの拡張は行われませんが、拡張する必要があります$path

ところで:私は使用することをお勧めします

path=$(basename $path)

あなたが次のようなことをすると、それははるかに一般的で読みやすくなります

path=$(basename $(pwd))

または小文字の結果を取得するには

path=$(basename $(pwd) | awk '{print tolower($0)}')

また

path=$(basename $(pwd) | tr 'A-Z' 'a-z' )
于 2012-10-02T12:22:55.960 に答える
2

フォーム

x=y cmd

環境変数を一時的xにvalueyに設定してから実行することを意味しますcmd。これは、これらの行がどのように解釈されるかを示しています。

path=eval 'pwd'
dirname=eval 'basename $path'

つまり、環境変数をリテラル値に設定してevalからコマンドを実行(または検索に失敗)する代わりに、期待どおりの動作をしていません。$(...)他の人が言っているように、コマンドの結果を文字列に補間する方法は、コマンドを(推奨)または`...`(レガシー)の中に入れることです。また、原則として、これらを二重引用符で囲む方が安全です(補間された参照を引用符で囲む方が安全です)。

path="$(pwd)"
dirname="$(basename "$path")"

(技術的には、この場合、外側の引用符は厳密には必要ありません。ただし、それでも良い習慣だと思います。)

于 2012-10-02T13:15:34.850 に答える
0

evalは渡されたコマンドを実行しますが、コマンドの終了ステータスコードのみを返すため、set演算子で実際に使用することはできません。右一重引用符を使用するか、またはセット演算子にコマンドを埋め込む方法$()

したがって、スクリプトは次のようになります。

#!/bin/bash

curr_path=$(pwd)
echo $curr_path
curr_dir=$(basename $curr_path)
echo $curr_dir
echo $curr_dir | awk '{print tolower($0)}'
于 2012-10-02T12:28:20.233 に答える
0
B=$(echo "Some text that has CAPITAL letters " | awk '{print tolower($0)}')
于 2012-10-02T12:22:43.550 に答える
0

二重引用符ではなく一重引用符を使用しているため、コードは機能しません。一重引用符は変数の展開を妨げるため、$path使用するパスに展開されず、文字列であるかのようにそのまま使用されます。

同じ理由で、awkの呼び出しは機能しません。

次のように、一重引用符を二重引用符に置き換える問題は解決できますが、次のようになります。

#!/bin/bash

path=eval "pwd"
dirname=eval "basename $path"

代わりに). There's no reason to useアクサングラーブ(この場合はeval`)を使用することをお勧めします。さらに、これを使用して、関心のある戻り値を収集することもできます。

#!/bin/bash

path=`pwd`
dirname=`basename $path`
variable=`echo $dirname | awk "{print tolower($0)}"`
于 2012-10-02T13:22:10.903 に答える
0
于 2013-11-26T20:27:02.593 に答える