簡體   English   中英

在Bash中獲取帶有空格的腳本路徑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM