[英]get the script path with whitespaces in Bash
我在MacOS El Capitan 10.10.6下运行它
在所有获取我当前目录(我正在从中运行脚本的路径)的命令中,这仅对我有效:
FILES="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
但是,如果文件夹名称中包含空格(又名:“文件夹名称”),则将无法正常工作
如何解决这个问题?
谢谢! )
更新:添加了一个脚本:
#!/bin/bash
function check ()
{
oldsize=`wc -c <"$1"`
sleep 1
newsize=`wc -c <"$1"`
while [ "$oldsize" -lt "$newsize" ]
do
echo "Not yet..."
oldsize=`wc -c <"$1"`
sleep 1
newsize=`wc -c <"$1"`
done
if [ "$oldsize" -eq "$newsize" ]
then
echo "The file has been copied completely."
fi
}
FILES="$(dirname "${BASH_SOURCE[0]}")/*"
function main
{
for f in $FILES
do
if [[ "$f" =~ \.mkv$ ]];
then
#/////////////////////////////////////////////////////////////////////
check "$f"
(( count = count + 1 ))
g="${f/mkv/avi}"
#LOG_FILE="${g/avi/log}"
#exec > >(tee -a "${LOG_FILE}" )
#exec 2> >(tee -a "${LOG_FILE}" >&2)
now="$(date)"
printf "Current date and time %s\n" "$now"
echo "Processing $f file..."
#avconv -i "${f}" -map 0:0 -map 0:1 -codec copy -sn "${g}"
avconv -i "$f" -map 0 -codec copy "$g"
if [ $? -eq 0 ]; then
echo OK
rm "$f"
else
echo FAIL
rm "$g"
#rm "$LOG_FILE"
return
fi
fi
#/////////////////////////////////////////////////////////////////////
done
}
############
count=0
############
main
if (($count > 0)); then
open "$(dirname "${BASH_SOURCE[0]}")"
fi
exit
我正在使用Mac OS X 10.11.6,并且有一个目录$HOME/tmp
。 从那里,我执行了:
$ cd $HOME/tmp
$ pwd
/Users/jleffler/tmp
$ mkdir -p "Spaced Out Directory "/bin
$ export PATH="$PATH:$PWD/$_"
$ cat <<'EOF' > Spaced\ Out\ \ Directory\ \ \ /bin/gorblinsky.sh
> #!/bin/bash
>
> echo "PWD=$PWD"
> DIR="$(dirname "${BASH_SOURCE[0]}")"
> echo "DIR=$DIR"
> cd "$DIR"
> pwd
> echo "PWD=$PWD"
> EOF
$ chmod +x Spaced\ Out\ \ Directory\ \ \ /bin/gorblinsky.sh
$ gorblinsky.sh
PWD=/Users/jleffler/tmp
DIR=/Users/jleffler/tmp/Spaced Out Directory /bin
/Users/jleffler/tmp/Spaced Out Directory /bin
PWD=/Users/jleffler/tmp/Spaced Out Directory /bin
$
这表明命令$(dirname "${BASH_SOURCE[0]}")
可以确定存储命令源的目录的名称。
如果脚本打算使用变量$DIR
来指定文件名,则需要小心(非常小心)以确保始终正确地对其进行引用。
例如:
cp "$DIR/gorblinksky.h" "$HOME/tmp/cobbled together name"
现代风格始终(双引号)引用所有变量引用,即使它们中没有需要保护的内容(例如,请参见shellcheck.net以及Google Shell样式指南 )。 我已经很老派了,不能在不能包含空格或元字符的名称周围加上引号,但是我想那只是老式的。 例如,我对一个脚本进行了外壳检查以使用RCS版本号,并且该脚本不引用包含点缀数字字符串的变量(9.19.2.24-也可以是IBM IPv4地址),并且被告知我不引用它们,尽管文件名已经用引号保护了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.