HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

シェルスクリプトに空白を含むパスを渡した場合の扱い

シェルスクリプト(bash)を書いていて、空白を含むパス(個人的には滅んでほしいが‥)の扱いに苦慮することがあるので、だめなケースとその実行結果も含めてメモしておく。

#! /bin/bash

printf "Number of args: %5d\n" $#
echo '=== foreach-1("$*")'
i=1
for d in "$*" ; do
    printf "%5d:" ${i}
    echo "    "${d}
    i=$((${i}+1))
done
echo '=== foreach-2("$@")'
i=1
for d in "$@" ; do
    printf "%5d:" ${i}
    echo "    "${d}
    i=$((${i}+1))
done

echo '=== foreach-3($*)'
i=1
for d in $* ; do
    printf "%5d:" ${i}
    echo "    "${d}
    i=$((${i}+1))
done
echo '=== foreach-4($@)'
i=1
for d in $@ ; do
    printf "%5d:" ${i}
    echo "    "${d}
    i=$((${i}+1))
done

echo "=== for"
for ((i = 1; i <= $#; ++i)); do
    printf "%5d:" ${i}
    eval d2='${'${i}'}'
    echo "    "${d2}
done

実行結果。実際に試したのは次の環境。

$ ./test.sh a "b c"
Number of args:     2
=== foreach-1("$*")
    1:    a b c
=== foreach-2("$@")
    1:    a
    2:    b c
=== foreach-3($*)
    1:    a
    2:    b
    3:    c
=== foreach-4($@)
    1:    a
    2:    b
    3:    c
=== for
    1:    a
    2:    b c

一番簡単なのは、「"$@"」と書くやり方。
最後の、for文とevalコマンドで「${1}、${2}、‥」という変数の評価結果を別の変数に入れるというやり方も場合によっては必要になるだろう。