3

スペースを処理したい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"

私が間違っていることの手がかりをありがとう!^_^

4

1 に答える 1

0

わかりました...これを提出したとき、私は自分が間違っていたことに気づきました。

2 つの相対パスを渡し、最初のパスに変更してから 2 番目のパスを確認していました。そのため、ディレクトリを変更すると、2 番目の相対パスは無効になりました。完成したら、更新されたスクリプトを投稿します。

編集:スクリプトを終了しました。下記参照。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"
于 2012-07-12T18:52:08.683 に答える