シェルスクリプトで壊さずに全ての引数を別コマンドに引き渡す書き方 221 views Post @wakairo 2025/12/29 19:37 最終更新 2025/12/29 19:40 基本はダブルクォーテーション付きの"$@" シェルスクリプトに渡された全ての引数を、そのシェルスクリプト内で別のコマンドに引き渡す場合は"$@"を使います。 例えば、以下のように記述します。 grep -n cat "$@" | sed "s/cat/__CAT__/g" | tee -a ~/foo.log "$*"や$@(ダブルクォーテーションなし)を使うと、'foo bar'のようなスペースを含む引数がスペースで分割されて壊れてしまいます。 shコマンドに渡すときはsh -c '..."$@"...' -- "$@" 1つの実行コマンドしか受け付けないsudoやssh、docker runなどで、 複数コマンドの実行などの複雑な処理を行いたいときに活躍するのがsh -c '...'です。 シェルスクリプト内でsh -c '...'にすべての引数を渡したいときは、sh -c '..."$@"...' -- "$@"と記述します。 例えば、以下のように記述します。 sudo sh -c 'grep -n cat "$@" | sed "s/cat/__CAT__/g" | tee -a /var/log/foo.log' -- "$@" 先頭のいくつかの引数を取り出して残りを渡す場合(おまけ) 検索ワードのような「固定の引数」と、複数のファイルのような「可変長の引数」が混在しているケースです。 これらをまとめてsudoやssh、docker runなどに投げたい場合は、 -cオプションの文字列内でshiftを使います。 以下は、第一引数が検索文字列、第二引数がその検索文字列を置き換える先の文字列、 第三引数以降はこの検索と置換の対象となるファイル(複数個指定可)となっている例です。 sudo sh -c 'pattern="$1"; replace="$2"; shift 2; grep -n "$pattern" "$@" | sed "s/$pattern/$replace/g" | tee -a /var/log/foo.log' -- "$@" 記入 プレビュー Markdownの書き方
@wakairo 2025/12/29 19:37 最終更新 2025/12/29 19:40 基本はダブルクォーテーション付きの"$@" シェルスクリプトに渡された全ての引数を、そのシェルスクリプト内で別のコマンドに引き渡す場合は"$@"を使います。 例えば、以下のように記述します。 grep -n cat "$@" | sed "s/cat/__CAT__/g" | tee -a ~/foo.log "$*"や$@(ダブルクォーテーションなし)を使うと、'foo bar'のようなスペースを含む引数がスペースで分割されて壊れてしまいます。 shコマンドに渡すときはsh -c '..."$@"...' -- "$@" 1つの実行コマンドしか受け付けないsudoやssh、docker runなどで、 複数コマンドの実行などの複雑な処理を行いたいときに活躍するのがsh -c '...'です。 シェルスクリプト内でsh -c '...'にすべての引数を渡したいときは、sh -c '..."$@"...' -- "$@"と記述します。 例えば、以下のように記述します。 sudo sh -c 'grep -n cat "$@" | sed "s/cat/__CAT__/g" | tee -a /var/log/foo.log' -- "$@" 先頭のいくつかの引数を取り出して残りを渡す場合(おまけ) 検索ワードのような「固定の引数」と、複数のファイルのような「可変長の引数」が混在しているケースです。 これらをまとめてsudoやssh、docker runなどに投げたい場合は、 -cオプションの文字列内でshiftを使います。 以下は、第一引数が検索文字列、第二引数がその検索文字列を置き換える先の文字列、 第三引数以降はこの検索と置換の対象となるファイル(複数個指定可)となっている例です。 sudo sh -c 'pattern="$1"; replace="$2"; shift 2; grep -n "$pattern" "$@" | sed "s/$pattern/$replace/g" | tee -a /var/log/foo.log' -- "$@"
CIを示す環境変数はCI? 2608 views Post @wakairo 2023/02/08 22:35 テストがCI (Continuous Integration) のシステム上で実行されていることを示すための環境変数の名前は、「CI」がデファクト・スタンダードになっているみたいです。 ちなみに、CIという名前の環境変数を知ったのは、Railsガイドを読んでいたら出てきたためです。そこで、自分が名前を知っているいくつかのCIについて既定の環境変数について確認したところ、確かにCIという名前の環境変数が定義されていました。 参考:各CIの既定の環境変数 GitHub Actions: https://docs.github.com/ja/actions/learn-github-actions/variables#default-environment-variables GitLab: https://gitlab-docs.creationline.com/ee/ci/variables/predefined_variables.html CircleCI: https://circleci.com/docs/ja/variables/#built-in-environment-variables 記入 プレビュー Markdownの書き方
@wakairo 2023/02/08 22:35 テストがCI (Continuous Integration) のシステム上で実行されていることを示すための環境変数の名前は、「CI」がデファクト・スタンダードになっているみたいです。 ちなみに、CIという名前の環境変数を知ったのは、Railsガイドを読んでいたら出てきたためです。そこで、自分が名前を知っているいくつかのCIについて既定の環境変数について確認したところ、確かにCIという名前の環境変数が定義されていました。 参考:各CIの既定の環境変数 GitHub Actions: https://docs.github.com/ja/actions/learn-github-actions/variables#default-environment-variables GitLab: https://gitlab-docs.creationline.com/ee/ci/variables/predefined_variables.html CircleCI: https://circleci.com/docs/ja/variables/#built-in-environment-variables
基本はダブルクォーテーション付きの
"$@"シェルスクリプトに渡された全ての引数を、そのシェルスクリプト内で別のコマンドに引き渡す場合は
"$@"を使います。 例えば、以下のように記述します。"$*"や$@(ダブルクォーテーションなし)を使うと、'foo bar'のようなスペースを含む引数がスペースで分割されて壊れてしまいます。shコマンドに渡すときは
sh -c '..."$@"...' -- "$@"1つの実行コマンドしか受け付けない
sudoやssh、docker runなどで、 複数コマンドの実行などの複雑な処理を行いたいときに活躍するのがsh -c '...'です。シェルスクリプト内で
sh -c '...'にすべての引数を渡したいときは、sh -c '..."$@"...' -- "$@"と記述します。 例えば、以下のように記述します。先頭のいくつかの引数を取り出して残りを渡す場合(おまけ)
検索ワードのような「固定の引数」と、複数のファイルのような「可変長の引数」が混在しているケースです。 これらをまとめて
sudoやssh、docker runなどに投げたい場合は、-cオプションの文字列内でshiftを使います。以下は、第一引数が検索文字列、第二引数がその検索文字列を置き換える先の文字列、 第三引数以降はこの検索と置換の対象となるファイル(複数個指定可)となっている例です。