Linux 跟踪移动的shell脚本
我希望有人能帮助我。在过去的一个多月里,我一直在学习Bash。。。我有一个程序(一个简单的语言学习程序),我希望能够安装并从脚本运行 我有一个脚本,它将创建一个新文件夹并将自己移动到其中。我目前的做法如下所示,尽管我在以后使用的阵列中遇到了问题。我想知道是否有更干净的方法来获取文件名的新路径。任何帮助或见解都将不胜感激Linux 跟踪移动的shell脚本,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我希望有人能帮助我。在过去的一个多月里,我一直在学习Bash。。。我有一个程序(一个简单的语言学习程序),我希望能够安装并从脚本运行 我有一个脚本,它将创建一个新文件夹并将自己移动到其中。我目前的做法如下所示,尽管我在以后使用的阵列中遇到了问题。我想知道是否有更干净的方法来获取文件名的新路径。任何帮助或见解都将不胜感激 #!/bin/bash echo "# path to me ---------------> ${0} " echo "# parent path -----
#!/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
祝你一切顺利,本退出好吧,您可以这样做以获得绝对路径:
PARENTPATH=$( cd "$( dirname "$0" )" && pwd )
NEWPATH=${PARENTPATH}/SomeNewFolder
为清楚起见,我可能会为公共值声明命名变量,而不是不断重用${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"
从make文件安装和设置程序更合适。诚然,一开始看起来很吓人,但是基本的东西,比如你想要什么,都很简单。对于您的项目,您最好有三项:
.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对空格敏感!这些缩进是制表符而不是四个空格
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
因为互动从来都不酷,为什么不酷呢顺便说一下,backticks中的echo是一种反模式,除非您确切地知道为什么要这样做。另请看,这是我正在尝试解决的文件的新路径。所以在创建dir并移动到那里之后$0仅指启动文件的时间-文件是否可更新?@user969617:您希望在哪个调用上知道新路径?您不能将值分配给
$0
,但是,由于我开始将其值复制到$me
中,然后使用该值,可以将新值分配给该变量,如me=“$path_to_me/$newdir/${me###*/}”
。现在,$me
是脚本在其新位置的完整路径。我知道在本例中,脚本可以使用${0}
或目录${0%/*}
找到其路径,但我的脚本在第一次运行时会自动移动。让我们假设当我们启动脚本时,dir=${0%/*}
当我们移动脚本时,我们必须使用dir=${0%/*}/NewFolder
?显然,在第二次运行脚本时,这些都不需要,因为dir=${0%/*}
将起作用。${0}
能否以任何方式刷新?所以它可以在脚本移动后调用,并找到新位置?(无需使用/NewFile
对其进行修改?这有意义吗?这不是一个大问题,只是一个小问题curiosity@user969617:不,这没有意义。第一次运行脚本时,$0
是它的原始位置。在脚本运行期间,脚本的位置会更改,$0
不会更改。在s第一次运行时,您可以使用变量$me
来表示移动后的新位置,如果它如上所示移动,则分配给它。在第二次运行脚本时,变量$0
显示新位置。在第二次运行脚本时,您可以将此位置称为变量$me
(并且位置不会再次更改)。在任何情况下,您都不能在运行期间更改$0…而且,您不需要更改。也许“程序”是一个强有力的词。它更像是一个400行bash脚本,可以接受用户输入等。安装部分实际上只是让人们在第一次运行脚本时设置它。我试图了解$0是否可以更新。。。我可以为bash脚本使用make文件吗?“安装程序”和“程序”?我将通读manmake页面…@user969617 make可以处理任何事情,而shell脚本仍然是一个程序。:)大多数时候,个人shell脚本都会进入users~/bin文件夹,但如果你打算将其发布给其他人,那么简单的“安装程序”是一种很好的形式。