跟踪移动的shell脚本

时间:2011-09-28 18:03:21

标签: linux bash shell unix

我希望有人可以帮助我。在过去一个月左右的时间里,我一直在学习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

一切顺利,本
    出口

4 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

嗯,你可以做这样的事情来获得绝对的路径:

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

答案 2 :(得分:0)

从make文件更适合安装和设置程序。当然,一开始看起来很吓人,但基本知识,比如你想要的东西,都很简单。对于您的项目,理想情况下您有三个项目:

  1. 您的计划
  2. 您的运行脚本
  3. 您的makefile,即您的安装程序
  4. 这打破了这些不同组件中的每一个,使每个组件更易于管理。如果将它们放在一起,则可以将tar文件移动到新计算机并重新安装而不进行任何更改。 Bash是一个很棒的工具,但它不是安装程序。

    下面的示例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是空格敏感的!那些缩进是标签而不是四个空格。

答案 3 :(得分: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因为交互性永远不会很酷,为什么不呢?