Shell脚本和路径中的空格

khm*_*ise 5 shell

我有更大的shell脚本来处理不同的东西.

它会通过以下方式获得它自己的位置......

BASEDIR=`dirname $0`/..
BASEDIR=`(cd "$BASEDIR"; pwd)`
Run Code Online (Sandbox Code Playgroud)

然后将使用BASEDIR创建其他变量

REPO="$BASEDIR"/repo
Run Code Online (Sandbox Code Playgroud)

但问题是如果路径包含当前执行的空格,则此shell脚本不起作用.

所以问题是:是否存在解决该问题的良好解决方案?

Fre*_*Foo 7

请务必双引用任何可能包含空格的内容:

BASEDIR="`dirname $0`"
BASEDIR="`(cd \"$BASEDIR\"; pwd)`"
Run Code Online (Sandbox Code Playgroud)


Sor*_*gal 5

答案是"到处都是行情".

如果您传入的路径中有空格,dirname $0则会失败.

$ cat quote-test.sh
#!/bin/sh

test_dirname_noquote () {
        printf 'no quotes: '
        dirname $1
}
test_dirname_quote () {
        printf 'quotes: '
        dirname "$1"
}

test_dirname_noquote '/path/to/file with spaces/in.it'
test_dirname_quote '/path/to/file with spaces/in.it'

$ sh quote-test.sh
no quotes: usage: dirname string
quotes: /path/to/file with spaces
Run Code Online (Sandbox Code Playgroud)

另外,试试这个有趣的例子

#!/bin/sh

mkdir -p /tmp/foo/bar/baz
cd /tmp/foo
ln -s bar quux
cd quux
cat >>find-me.sh<<"."
#!/bin/sh

self_dir="$(dirname $0)"
base_dir="$( (cd "$self_dir/.." ; pwd -P) )"
repo="$base_dir/repo"

printf 'self: %s\n' "$self_dir"
printf 'base: %s\n' "$base_dir"
printf 'repo: %s\n' "$repo"
.

sh find-me.sh

rm -rf /tmp/foo
Run Code Online (Sandbox Code Playgroud)

运行时的结果:

$ sh example.sh
self: .
base: /tmp/foo
repo: /tmp/foo/repo
Run Code Online (Sandbox Code Playgroud)


sra*_*mai 2

像这样引用你的完整变量:

REPO="$BASEDIR/repo"
Run Code Online (Sandbox Code Playgroud)