2011-09-28 131 views
2

我希望有人能幫助我。在過去的一個月左右,我一直在學習Bash ...我有一個程序(一個簡單的語言學習程序),我希望能夠通過腳本進行安裝和運行。跟蹤移動的外殼腳本

我有一個腳本,將創建一個新的文件夾並將其自身移入它。我目前的做法是在下面,儘管我以後使用的陣列有問題。我想知道是否有一種更清晰的方法來獲取文件名的新路徑。任何幫助或見解將不勝感激。

#!/bin/bash 

echo "# path to me ---------------> ${0}  " 
echo "# parent path --------------> ${0%/*} " 
echo "# my name ------------------> ${0##*/} " 

if [[ ! -d ${0%/*}/SomeNewFolder ]] && [[ ! -d ${0%/*}/../SomeNewFolder ]] 
then 
    mkdir ${0%/*}/SomeNewFolder 
    mv ${0} ${0%/*}/SomeNewFolder/${0##*/} 
fi 

echo ${0%/*} 
newpath=$(echo "${0%/*}/SomeNewFolder") 
echo $newpath 

一切順利,本
出口

+1

順便說一句,反引號中的回聲是一個反模式,除非你確切地知道你爲什麼這樣做。另見http://partmaps.org/era/unix/award.html#echo – tripleee

回答

2

爲清楚起見,我可能會申報命名變量您的共同價值,而不是不斷重複使用$ {0}數組。引用變量和字符串也是很好的做法。

我看到的唯一一個主要問題是運行./script.sh會使$ 0等於文件名,所以我在這種情況下在開頭添加「./」。

#!/bin/bash -u 

ME="${0}" 
if [[ ! "$ME" =~ /^\// ]]; then 
     ME="./$ME" 
fi 
PARENT="${ME%/*}" 
FILENAME="${ME##*/}" 
FOLDER="SomeNewFolder" 
NEW="$PARENT/$FOLDER" 

if [[ ! -d "$NEW" ]] && [[ "${PARENT%/*}" != "$FOLDER" ]]; then 
     mkdir "$NEW" 
     mv "$ME" "$NEW" 
fi 

echo "$PARENT" 
echo "$NEW" 
0

嗯,你可以做這樣的事情得到一個絕對路徑:

PARENTPATH=$(cd "$(dirname "$0")" && pwd) 
NEWPATH=${PARENTPATH}/SomeNewFolder 
0

安裝和設置程序更適合在make文件中完成。當然,起初它似乎很嚇人,但基本的東西,比如你想要的,很簡單。對於你的項目,你會非常有三個項目:

  1. 程序
  2. 您運行腳本
  3. 你的makefile即您的安裝

這打散這些不同的組件,使得每他們更容易管理。如果你把它們放在一起,你可以將tar文件移動到一臺新電腦上,不需要做任何改動就可以重新安裝。 Bash是一個很棒的工具,但它不是一個安裝程序。

樣品化妝下面的腳本:

.PHONY: all clean 
SCRIPT=yourScriptName.sh 
SUBFOLDER=someFolder 

all: $(SCRIPT) 

$(SCRIPT): $(SUBFOLDER) 
    cp $(SCRIPT) $(SUBFOLDER)  
$(SUBFOLDER): 
    mkdir $(SUBFOLDER) 
clean: 
    -rm -f $(SUBFOLDER)/$(SCRIPT) 
    -rmdir $(SUBFOLDER) 

重要! make對空白敏感!這些縮進是標籤不是四個空格。

+0

也許'程序'是一個強詞。它更像是一個可以接受用戶輸入等的400行bash腳本......安裝部分實際上只是讓人們在第一次運行腳本時設置它。我想了解是否可以更新$ 0 ...我可以使用make文件來製作bash腳本嗎? '安裝程序'和'程序'?我將閱讀man make頁面... – beoliver

+0

@ user969617 Make可以用於任何事情,而shell腳本仍然是一個程序。 :)大多數情況下,個人shell腳本進入用戶〜/ bin文件夾,但如果您打算將它推送給用戶,那麼一個簡單的「安裝程序」就是一種很好的形式。 –

0
me="$0" 
newdir=SomeNewFolder 

if [[ $me =~ ^/ ]] ; then 
    full_path="$me" 
else 
    full_path="$PWD/$me" 
fi 
full_path="${full_path//\/\.\///}" # prettify 

path_to_me="${full_path%/*}" 
parent_dir="${path_to_me##*/}" 

if [ ! "$parent_dir" = "$newdir" ] ; then 
    mkdir -p "$path_to_me/$newdir" 
    mv -f "$full_path" "$path_to_me/$newdir/" 
fi 

基本上類似於lunixbochs在做,但有一些小的改動

  1. 小寫的變量名,以免與環境變量混淆
  2. 粗略估計絕對路徑
  3. -f-p因爲互動性從來就不是很酷,爲什麼不呢?
+0

這是我試圖解決的新文件路徑。所以在創建dir並在那裏移動。只有$ 0是指文件啓動的時間 - 是否可更新? – beoliver

+0

@ user969617:您想在哪個調用中知道新路徑?你不能爲'$ 0'賦值,但是因爲我開始將它的值複製到'$ me'中,然後使用它,可以將新值賦給那個變量,比如'me =「$ path_to_me/$ newdir/$ {我## * /}「'。現在'$ me'是腳本在其新位置的完整路徑。 – Sorpigal

+0

我知道在這種情況下.command的腳本可以使用'$ {0}'或目錄'$ {0%/ *}'找到它的路徑,但是我的腳本在第一次運行時會自動移動。讓我們說當我們移動腳本時,當我們開始'dir = $ {0%/ *}'腳本時,是否必須使用'dir = $ {0%/ *}/NewFolder'?很明顯,腳本第二次運行時,不需要這些,因爲'dir = $ {0%/ *}'會起作用。可以''{0}'以任何方式刷新?所以可以在腳本移動後調用它並找到新的位置? (不需要用'/ NewFile'修改它?這是否有意義?這不是一個主要問題,只是一個好奇心 – beoliver