Open6

Shell

txtytztxtytz

${variable}と"${variable}"

  1. ${variable}
    • 変数の値を直接使用する場合に使われる
  2. "${variable}"
    • 変数の値に空白文字や特殊文字が含まれる場合でも、それらを含めて一つの引数として扱われる
name="John Doe"
echo ${name}     # 出力: John Doe
echo "${name}"   # 出力: John Doe

files="file1.txt file2.txt"
cp ${files} destination/    # file1.txtとfile2.txtが個別のファイル名として扱われ、コピーが成功する
cp "${files}" destination/  # "file1.txt file2.txt"が一つのファイル名として扱われ、コピーが失敗する
txtytztxtytz

$str1と"$str1"と${str1}の違いについて説明します。

  1. $str1:
    • 変数str1の値を参照します。
    • シェルスクリプト内で単独で使用した場合、変数の値が展開されます。
    • ただし、変数名が他の文字列と連結している場合、意図しない結果になることがあります。

例:

str1="hello"
echo $str1      # 出力: hello
echo $str1_world  # 出力: (str1_worldという変数が存在しない場合は空の出力)
  1. "$str1":
    • 変数str1の値を参照します。
    • ダブルクォーテーション("")で囲むことで、変数の値が適切に展開されます。
    • 変数の値に空白や特殊文字が含まれる場合でも、それらを含めて一つの引数として扱われます。

例:

str1="hello world"
echo "$str1"     # 出力: hello world
echo "$str1!"    # 出力: hello world!
  1. ${str1}:
    • 変数str1の値を参照します。
    • 変数名を明示的に指定する場合に使用します。
    • 変数名が他の文字列と連結している場合や、変数名の直後に他の文字列が続く場合に使用します。

例:

str1="hello"
echo ${str1}      # 出力: hello
echo ${str1}_world  # 出力: hello_world
echo ${str1}!     # 出力: hello!

一般的なルールとして、以下のように使い分けることが推奨されます:

  • 変数の値を単独で使用する場合は、$str1のように変数名のみを使用します。
  • 変数の値をダブルクォーテーションで囲む場合は、"$str1"のように使用します。これにより、変数の値が適切に展開され、空白や特殊文字を含む値も正しく扱われます。
  • 変数名が他の文字列と連結している場合や、変数名の直後に他の文字列が続く場合は、${str1}のように変数名を明示的に指定します。

これらの使い分けを理解することで、シェルスクリプトにおける変数の参照を適切に行うことができます。状況に応じて適切な記法を選択し、変数の値を正しく扱うようにしてください。

txtytztxtytz

$(command):コマンド置換

  • コマンドの実行結果を文字列として取得する
# 現在の日付を変数に代入する
current_date=$(date +%Y-%m-%d)
echo "Today is ${current_date}"

# ファイルの行数を変数に代入する
num_lines=$(wc -l < file.txt)
echo "The file has ${num_lines} lines"

# コマンドの実行結果をファイルに書き込む
echo "Current directory contents:" > output.txt
ls -l >> output.txt

# コマンドの実行結果を別のコマンドの引数として使用する
backup_file="backup-$(date +%Y-%m-%d).tar.gz"
tar -czf "${backup_file}" ./data/
txtytztxtytz

IFS=' ' read -r -a array <<< "$variable"

  • IFS=' '
    • Internal Field Separator(IFS)を空白文字(スペース)に設定。これにより、文字列を分割する際の区切り文字を指定できる
  • read -r -a array <<< "$variable"
    • ariableの値をarray配列に読み込む。-rオプションは、バックスラッシュ(\)をエスケープ文字として扱わないようにするために使用。
txtytztxtytz
  1. 文字列の比較を行う場合:

str1="hello"
str2="world"

if [[ "$str1" == "$str2" ]]; then
  echo "The strings are equal"     # 出力されない
else
  echo "The strings are not equal" # 出力: The strings are not equal
fi

if [[ "$str1" != "$str2" ]]; then
  echo "The strings are not equal" # 出力: The strings are not equal
else
  echo "The strings are equal"     # 出力されない
fi
  1. 数値の比較を行う場合:
num1=10
num2=20

if [[ "$num1" -eq "$num2" ]]; then
  echo "The numbers are equal"     # 出力されない
else
  echo "The numbers are not equal" # 出力: The numbers are not equal
fi

if [[ "$num1" -ne "$num2" ]]; then
  echo "The numbers are not equal" # 出力: The numbers are not equal
else
  echo "The numbers are equal"     # 出力されない
fi

if [[ "$num1" -lt "$num2" ]]; then
  echo "num1 is less than num2"    # 出力: num1 is less than num2
else
  echo "num1 is not less than num2" # 出力されない
fi
  1. ファイルやディレクトリの属性を確認する場合:
file="example.txt"
dir="test_dir"

if [[ -e "$file" ]]; then
  echo "The file exists"           # ファイルが存在する場合は出力: The file exists
else
  echo "The file does not exist"   # ファイルが存在しない場合は出力: The file does not exist
fi

if [[ -d "$dir" ]]; then
  echo "The directory exists"      # ディレクトリが存在する場合は出力: The directory exists
else
  echo "The directory does not exist" # ディレクトリが存在しない場合は出力: The directory does not exist
fi

if [[ -f "$file" ]]; then
  echo "The file is a regular file" # 通常のファイルである場合は出力: The file is a regular file
else
  echo "The file is not a regular file" # 通常のファイルでない場合は出力: The file is not a regular file
fi
  1. パターンマッチングを行う場合:
str="123abc"

if [[ "$str" =~ ^[0-9]+$ ]]; then
  echo "The string contains only digits" # 出力されない
else
  echo "The string does not contain only digits" # 出力: The string does not contain only digits
fi
  1. シンプルなコマンドの実行結果を確認する場合:
file="example.txt"

if grep -q "pattern" "$file"; then
  echo "The pattern is found in the file" # パターンが見つかった場合は出力: The pattern is found in the file
else
  echo "The pattern is not found in the file" # パターンが見つからない場合は出力: The pattern is not found in the file
fi
  1. 算術式の評価を行う場合:
num1=10
num2=20

if (( num1 > num2 )); then
  echo "num1 is greater than num2" # 出力されない
else
  echo "num1 is not greater than num2" # 出力: num1 is not greater than num2
fi

字列の比較、数値の比較、ファイルやディレクトリの属性の確認、パターンマッチングには[[ ... ]]を使用。一方、シンプルなコマンドの実行結果の確認にはif grep -q ...を使用し、算術式の評価には(( ... ))を使用。