BASH脚本:处理带有转义空格的路径

时间:2012-07-12 18:40:35

标签: linux bash

我有一个bash脚本,我想处理空格。我知道这里有很多问题,但我无法解决我的问题。

根据我所读到的,以下内容应该有效。空间 ../tool_profile/OS\ Firmware/updater正在被转义。在脚本中,$2变量在分配给DEST时会用引号括起来。

如果我将此路径传递到引号括起来的ls或命令行中的转义空格,则可以正常工作。

示例脚本命令:

./make_initramfs.sh initramfs_root/ ../tool_profile/OS\ Firmware/updater/ initramfs
来自脚本ls的

错误:

ls: cannot access ../tool_profile/OS Firmware/updater/: No such file or directory

make_initramfs.sh:

#!/bin/bash

if [ $# -ne 3 ]; then
        echo "Usage: `basename $0` <root> <dest> <archive_name>"
        exit 1
fi

ROOT=$1
DEST="$2"
NAME=$3

echo "[$DEST]"

# cd and hide output
cd $ROOT 2&>/dev/null

if [ $? -eq 1 ]; then
        echo "invalid root: $ROOT"
        exit 1
fi


ls "$2" # doesn't work
ls "$DEST" # doesn't work


# check for 'ls' errors
#if [ $? -eq 1 ]; then
#        echo "invalid dest: $DEST"
#        exit 1
#fi

#sudo find . | sudo cpio -H newc -o | gzip --best > "$DEST"/"$NAME"

感谢您对我做错的任何线索! ^ _ ^

1 个答案:

答案 0 :(得分:0)

好的......就在我提交的时候,我意识到我做错了什么。

我正在通过两条相对路径并在验证第二条路径之前更改为第一条路径。因此,一旦我更改了目录,第二个相对路径就不再有效了。一旦完成,我将发布一个更新的脚本。

编辑:我完成了我的脚本。见下文。 Edit2:我根据每个人的评论更新了这个。谢谢大家!

<强> make_initramfs.sh:

#!/bin/bash


if (( $# != 2 )); then
    echo "Usage: `basename $0` <root> <dest>"
    exit 1
fi

root="$1"
archive="${2##*/}"
dest="$PWD/${2%/*}"

# cd and hide errors
cd "$root" &>/dev/null
if (( $? != 0 )); then
    echo "invalid path: $root"
    exit 1
fi

if [ ! -d "$dest" ]; then
    echo "invalid path: $dest"
    exit 1
fi

if [ "$archive" = "" ]; then
    echo "no archive file specified"
    exit 1
fi

if [ `whoami` != root ]; then
    echo "please run this script as root or using sudo"
    exit 1
fi

find . | cpio -H newc -o | gzip --best > "$dest"/"$archive"