$1 が 1 でない場合でも、 'if [ $1="1" ]' 分岐が常に選択されるのはなぜですか。

$1 が 1 でない場合でも、 'if [ $1=

以下のように "teleport.sh" というシェルスクリプトがあります。

if [ $1="1" ];
    then
    shift
        mv "$@" ~/lab/Sun
elif [ $1="2" ];
    then
    shift
        mv "$@" ~/lab/Moon
elif [ $1="3" ];
    then
    shift
        mv "$@" ~/lab/Earth
fi

私が実行したとき:

sh teleport.sh 2 testfile

これはディレクトリtestfileに移動されます~/lab/Sunが、スクリプトに 1 または "1" を渡さないため混乱します。

どうなりますか?

ベストアンサー1

スペースを使用すると問題を解決できます。

if [ "$1" = 1 ];
    then
    shift
        mv "$@" ~/lab/Sun
elif [ "$1" = 2 ];
    then
    shift
        mv "$@" ~/lab/Moon
elif [ "$1" = 3 ];
    then
    shift
        mv "$@" ~/lab/Earth
fi

これはもっときれいですが:

#!/bin/bash

action=$1
shift
files=("$@")
case $action in  
  1) mv -- "${files[@]}" ~/lab/Sun     ;;
  2) mv -- "${files[@]}" ~/lab/Moon    ;;
  3) mv -- "${files[@]}" ~/lab/Earth   ;;
esac

おすすめ記事