26

私の bash スクリプトはファイル名 (または相対パス) を文字列として受け取りますが、そのファイルから読み取る必要があります。スクリプトで直接リテラルとして宣言した場合にのみファイル名から読み取ることができます(引用符なし)...最初は暗黙的に文字列であるため、引数には不可能です。観察:

a="~/test.txt"
#Look for it
if [[ -a $a ]] ; then
    echo "A Found it"
else
    echo "A Error"
fi
#Try to use it
while read line; do
    echo $line
done < $a

b='~/test.txt'
#Look for it
if [[ -a $b ]] ; then
    echo "B Found it"
else
    echo "B Error"
fi
#Try to use it
while read line; do
    echo $line
done < $b

c=~/test.txt
#Look for it
if [[ -a $c ]] ; then
    echo "C Found it"
else
    echo "C Error"
fi
#Try to use it
while read line; do
    echo $line
done < $c

収量:

A Error
./test.sh: line 10: ~/test.txt: No such file or directory
B Error
./test: line 12: ~/test.txt: No such file or directory
C Found it
Hello

上で述べたように、上記のルーチンにコマンド ライン引数を渡すことはできません。

4

2 に答える 2

49

これは拡張のルールの一部です~~が引用されている場合、この展開は実行されないことが Bash のマニュアルに明記されています。

回避策 1

を引用しないでください~

file=~/path/to/file

ファイル名の残りの部分を引用する必要がある場合:

file=~/"path with spaces/to/file"

(これは、さまざまなシェルで完全に合法です。)

回避策 2

$HOMEの代わりに使用し~ます。

file="$HOME/path/to/file"

ところで:シェル変数の型

シェル変数の型について少し混乱しているようです。

すべてが文字列です。

沈むまで繰り返します。すべてが文字列です。(整数を除いて、それらはほとんど文字列のハックです。そして配列ですが、それらは文字列の配列です。)

これはシェル文字列です: "foo". そうです"42"。そうです42。そうですfoo。引用する必要がない場合は、引用しないのが妥当です。誰がタイプしたい"ls" "-la" "some/dir"ですか?

于 2013-05-23T00:25:11.090 に答える