2011-09-28 90 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