跟踪移动的外壳脚本
我希望有人能帮助我。在过去的一个月左右,我一直在学习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
一切顺利,本
出口
为清楚起见,我可能会申报命名变量您的共同价值,而不是不断重复使用$ {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"
嗯,你可以做这样的事情得到一个绝对路径:
PARENTPATH=$(cd "$(dirname "$0")" && pwd)
NEWPATH=${PARENTPATH}/SomeNewFolder
安装和设置程序更适合在make文件中完成。当然,起初它似乎很吓人,但基本的东西,比如你想要的,很简单。对于你的项目,你会非常有三个项目:
- 程序
- 您运行脚本
- 你的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对空白敏感!这些缩进是标签不是四个空格。
也许'程序'是一个强词。它更像是一个可以接受用户输入等的400行bash脚本......安装部分实际上只是让人们在第一次运行脚本时设置它。我想了解是否可以更新$ 0 ...我可以使用make文件来制作bash脚本吗? '安装程序'和'程序'?我将阅读man make页面... – beoliver
@ user969617 Make可以用于任何事情,而shell脚本仍然是一个程序。 :)大多数情况下,个人shell脚本进入用户〜/ bin文件夹,但如果您打算将它推送给用户,那么一个简单的“安装程序”就是一种很好的形式。 –
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在做,但有一些小的改动
- 小写的变量名,以免与环境变量混淆
- 粗略估计绝对路径
-
-f
和-p
因为互动性从来就不是很酷,为什么不呢?
这是我试图解决的新文件路径。所以在创建dir并在那里移动。只有$ 0是指文件启动的时间 - 是否可更新? – beoliver
@ user969617:您想在哪个调用中知道新路径?你不能为'$ 0'赋值,但是因为我开始将它的值复制到'$ me'中,然后使用它,可以将新值赋给那个变量,比如'me =“$ path_to_me/$ newdir/$ {我## * /}“'。现在'$ me'是脚本在其新位置的完整路径。 – Sorpigal
我知道在这种情况下.command的脚本可以使用'$ {0}'或目录'$ {0%/ *}'找到它的路径,但是我的脚本在第一次运行时会自动移动。让我们说当我们移动脚本时,当我们开始'dir = $ {0%/ *}'脚本时,是否必须使用'dir = $ {0%/ *}/NewFolder'?很明显,脚本第二次运行时,不需要这些,因为'dir = $ {0%/ *}'会起作用。可以''{0}'以任何方式刷新?所以可以在脚本移动后调用它并找到新的位置? (不需要用'/ NewFile'修改它?这是否有意义?这不是一个主要问题,只是一个好奇心 – beoliver
顺便说一句,反引号中的回声是一个反模式,除非你确切地知道你为什么这样做。另见http://partmaps.org/era/unix/award.html#echo – tripleee