Bash関数へのパラメーターの受け渡し

1049
stivlo 2011-06-02 22:35.

Bash関数でパラメーターを渡す方法を検索しようとしていますが、常にコマンドラインからパラメーターを渡す方法が表示されます。

スクリプト内でパラメーターを渡したいのですが。私は試した:

myBackupFunction("..", "...", "xx")

function myBackupFunction($directory, $options, $rootPassword) {
     ...
}

しかし、構文が正しくありません。パラメーターを関数に渡す方法は?

7 answers

1705
dogbane 2011-06-02 22:57.

関数を宣言する典型的な方法は2つあります。私は2番目のアプローチを好みます。

function function_name {
   command...
} 

または

function_name () {
   command...
} 

引数を使用して関数を呼び出すには:

function_name "$arg1" "$arg2"

この関数は、渡された引数を(名前ではなく)位置で参照します。 $1, $2など。$ 0は、スクリプト自体の名前です。

例:

function_name () {
   echo "Parameter #1 is $1"
}

また、宣言に関数を呼び出す必要があります。

#!/usr/bin/env sh

foo 1  # this will fail because foo has not been declared yet.

foo() {
    echo "Parameter #1 is $1"
}

foo 2 # this will work.

出力:

./myScript.sh: line 2: foo: command not found
Parameter #1 is 2

参照:高度なBashスクリプトガイド。

78
Anthony Rutledge 2014-05-11 10:30.

高水準プログラミング言語(C / C ++ / Java / PHP / Python / Perl ...)の知識は、bash関数が他の言語と同じように機能する必要があることを素人に示唆します。代わりに、bash関数はシェルコマンドのように機能し、シェルコマンドにオプションを渡すのと同じ方法で引数が渡されることを期待します(例ls -l)。実際、bashの関数の引数は、位置パラメーター(、など)として扱われます。これは、どのように機能するかを考えると当然のことです。bashで関数を呼び出すために括弧を使用しないでください。$1, $2..$9, ${10}, ${11}getopts


:現在、Open Solarisで作業しています。)

# bash style declaration for all you PHP/JavaScript junkies. :-)
# $1 is the directory to archive
# $2 is the name of the tar and zipped file when all is done. function backupWebRoot () { tar -cvf - $1 | zip -n .jpg:.gif:.png $2 - 2>> $errorlog &&
        echo -e "\nTarball created!\n"
}


# sh style declaration for the purist in you. ;-)
# $1 is the directory to archive # $2 is the name of the tar and zipped file when all is done.
backupWebRoot ()
{
    tar -cvf - $1 | zip -n .jpg:.gif:.png $2 - 2>> $errorlog && echo -e "\nTarball created!\n" } # In the actual shell script # $0               $1 $2

backupWebRoot ~/public/www/ webSite.tar.zip

変数に名前を使用したい。これを行うだけです。

declare filename=$1 # declare gives you more options and limits variable scope

配列を関数に渡したいですか?

callingSomeFunction "${someArray[@]}" # Expands to all array elements.

関数内で、このように引数を処理します。

function callingSomeFunction ()
{
    for value in "[email protected]" # You want to use "$@" here, not "$*" !!!!!
    do
        :
    done
}

値と配列を渡す必要がありますが、それでも関数内で「$ @」を使用しますか?

function linearSearch ()
{
    declare myVar="$1" shift 1 # removes $1 from the parameter list

    for value in "[email protected]" # Represents the remaining parameters. do if [[ $value == $myVar ]] then echo -e "Found it!\t... after a while." return 0 fi done return 1 } linearSearch $someStringValue "${someArray[@]}"
69
niieani 2015-05-05 05:23.

名前付きパラメーターを使用したい場合は、(いくつかのトリックで)実際に名前付きパラメーターを関数に渡すことができます(配列と参照を渡すこともできます)。

私が開発したメソッドを使用すると、次のような関数に渡される名前付きパラメーターを定義できます。

function example { args : string firstName , string lastName , integer age } {
  echo "My name is ${firstName} ${lastName} and I am ${age} years old."
}

引数に@requiredまたは@readonlyの注釈を付けたり、... rest引数を作成したり、順次引数から配列を作成したり(egを使用string[4])、オプションで引数を複数行にリストしたりすることもできます。

function example {
  args
    : @required string firstName
    : string lastName
    : integer age
    : string[] ...favoriteHobbies

  echo "My name is ${firstName} ${lastName} and I am ${age} years old."
  echo "My favorite hobbies include: ${favoriteHobbies[*]}"
}

言い換えれば、パラメーターを名前で呼び出すことができるだけでなく(より読みやすいコアを構成します)、実際に配列を渡すことができます(そして変数への参照-この機能はbash 4.3でのみ機能します)!さらに、マップされた変数は、$ 1(およびその他)と同様に、すべてローカルスコープにあります。

これを機能させるコードは非常に軽量で、bash3とbash4の両方で機能します(これらは私がテストした唯一のバージョンです)。bashを使用した開発をより便利で簡単にするこのようなトリックに興味がある場合は、私のBash InfinityFrameworkをご覧ください。以下のコードはその機能の1つとして利用できます。

shopt -s expand_aliases

function assignTrap {
  local evalString
  local -i paramIndex=${__paramIndex-0} local initialCommand="${1-}"

  if [[ "$initialCommand" != ":" ]] then echo "trap - DEBUG; eval \"${__previousTrap}\"; unset __previousTrap; unset __paramIndex;"
    return
  fi

  while [[ "${1-}" == "," || "${1-}" == "${initialCommand}" ]] || [[ "${#@}" -gt 0 && "$paramIndex" -eq 0 ]] do shift # first colon ":" or next parameter's comma "," paramIndex+=1 local -a decorators=() while [[ "${1-}" == "@"* ]]
    do
      decorators+=( "$1" ) shift done local declaration= local wrapLeft='"' local wrapRight='"' local nextType="$1"
    local length=1

    case ${nextType} in string | boolean) declaration="local " ;; integer) declaration="local -i" ;; reference) declaration="local -n" ;; arrayDeclaration) declaration="local -a"; wrapLeft= ; wrapRight= ;; assocDeclaration) declaration="local -A"; wrapLeft= ; wrapRight= ;; "string["*"]") declaration="local -a"; length="${nextType//[a-z\[\]]}" ;;
      "integer["*"]") declaration="local -ai"; length="${nextType//[a-z\[\]]}" ;; esac if [[ "${declaration}" != "" ]]
    then
      shift
      local nextName="$1" for decorator in "${decorators[@]}"
      do
        case ${decorator} in @readonly) declaration+="r" ;; @required) evalString+="[[ ! -z \$${paramIndex} ]] || echo \"Parameter '$nextName' ($nextType) is marked as required by '${FUNCNAME[1]}' function.\"; " >&2 ;; @global) declaration+="g" ;; esac done local paramRange="$paramIndex"

      if [[ -z "$length" ]] then # ...rest paramRange="{@:$paramIndex}"
        # trim leading ...
        nextName="${nextName//\./}" if [[ "${#@}" -gt 1 ]]
        then
          echo "Unexpected arguments after a rest array ($nextName) in '${FUNCNAME[1]}' function." >&2
        fi
      elif [[ "$length" -gt 1 ]] then paramRange="{@:$paramIndex:$length}" paramIndex+=$((length - 1))
      fi

      evalString+="${declaration} ${nextName}=${wrapLeft}\$${paramRange}${wrapRight}; " # continue to the next param: shift fi done echo "${evalString} local -i __paramIndex=${paramIndex};" } alias args='local __previousTrap=$(trap -p DEBUG); trap "eval \"\$(assignTrap \$BASH_COMMAND)\";" DEBUG;'
26
Noname 2011-06-02 22:36.

親とコンマを見逃します:

 myBackupFunction ".." "..." "xx"

関数は次のようになります。

function myBackupFunction() {
   # here $1 is the first parameter, $2 the second etc.
}
8
Milad P. 2016-10-24 20:49.

この例がお役に立てば幸いです。ユーザーから2つの数値を受け取り、それらをadd(コードの最後の行にある)呼び出された関数にフィードし、それらをadd合計して出力します。

#!/bin/bash

read -p "Enter the first  value: " x
read -p "Enter the second value: " y

add(){
    arg1=$1 #arg1 gets to be the first assigned argument (note there are no spaces) arg2=$2 #arg2 gets to be the second assigned argument (note there are no spaces)

    echo $(($arg1 + $arg2))
}

add x y #feeding the arguments
6
Adiii 2017-11-24 03:12.

スクリプトの実行中または関数の呼び出し中にスクリプト内の両方をクリアする簡単な例。

#!/bin/bash
echo "parameterized function example"
function print_param_value(){
    value1="${1}" # $1 represent first argument
    value2="${2}" # $2 represent second argument
    echo "param 1 is  ${value1}" #as string echo "param 2 is ${value2}"
    sum=$(($value1+$value2)) #process them as number echo "The sum of two value is ${sum}"
}
print_param_value "6" "4" #space sparted value
#you can also pass paramter durign executing script
print_param_value "$1" "$2" #parameter $1 and $2 during executing

#suppose our script name is param_example
# call like this 
# ./param_example 5 5
# now the param will be $1=5 and $2=5
5
Wil 2017-02-21 10:19.

名前付きパラメーターをbashに渡す別の方法について言及してパイプインすると思いました...参照で渡します。これはbash4.0以降でサポートされています

#!/bin/bash
function myBackupFunction(){ # directory options destination filename
local directory="$1" options="$2" destination="$3" filename="$4";
  echo "tar cz ${!options} ${!directory} | ssh [email protected] \"cat > /mnt/${!destination}/${!filename}.tgz\"";
}

declare -A backup=([directory]=".." [options]="..." [destination]="backups" [filename]="backup" );

myBackupFunction backup[directory] backup[options] backup[destination] backup[filename];

bash 4.3の代替構文は、namerefを使用することです。

namerefはシームレスに逆参照するという点ではるかに便利ですが、サポートされている古いディストリビューションの中にはまだ古いバージョンを出荷しているものがあるため、まだお勧めしません。

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

あなたが危険なほど過熱しているかどうかを知る方法

あなたが危険なほど過熱しているかどうかを知る方法

カリフォルニア州カレキシコでは、6月上旬に気温が約115度に達すると、人々はダウンタウンを歩きます。私たちは夏にたった2週間で、熱波はすでに米国を灼熱しています。

庵野秀明がシン・ウルトラマンのモーションキャプチャ俳優として最高の人生を送るのを見る

庵野秀明がシン・ウルトラマンのモーションキャプチャ俳優として最高の人生を送るのを見る

庵野秀明は、ついに新世紀エヴァンゲリオンを締めくくった後、自分のやりたいことを何でもしているようだ(少なくとも今のところ)。彼はウルトラマン映画を作るようになり、現在は仮面ライダー1号を監督しており、生涯にわたる2つのスーパーヒーローの執着のために新しい章を作成することを彼に任せています。

今週のおもちゃのニュースは間違いなくあなたのウーキーを曲げました

今週のおもちゃのニュースは間違いなくあなたのウーキーを曲げました

io9の最新かつ最高のオタク玩具ニュースの定期的なまとめであるToyAisleへようこそ。今週は、オビ=ワンの水曜日をさらに2つのハズブロフィギュアで締めくくります。Super7はスプリングフィールドに戻り、さらに多くのシンプソンズアルティメットを目指します。ダースベイダーをバップする勇気はありますか?見てみな!プレイメイトは、初期の頃からのシンプソンズのフィギュアの信じられないほど豊富なラインで素晴らしい仕事をしましたが、Super7のシンプソンズアルティメットほど詳細でアクセサリー化されていませんでした!数字—彼らがもっと早く彼らを追い出し始めてくれることを願っています。

ディズニーの不条理な$5,000スターウォーズカクテルの実際の内容は次のとおりです

ディズニーの不条理な$5,000スターウォーズカクテルの実際の内容は次のとおりです

その悪名高い5,000ドルのスターウォーズをテーマにした飲み物に何が入っているのか知りたいと思っているなら、それはもはや完全な謎ではありません。ハイパースペースラウンジのディズニーウィッシュクルーズ船で独占的に入手できるカイバークリスタルは、豪華に提示されたテーマカクテルで、提供されるカムトノに付属しているはずですが、残念ながらそうではありません。銀河系で最も高価なトップシェルフセレクション。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

Seguindo Todos os Protocolos (2022), de Fábio Leal

Seguindo Todos os Protocolos (2022), de Fábio Leal

Chico quer transar. Até aí, tudo bem.

多元宇宙—Junø

多元宇宙—Junø

チェーン間アカウントがJunoに登場します。異なるブロックチェーン間でスマートコントラクトの構成可能性と真の相互運用性を提供します。

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

1.ドラマを見た後、起業する考えはありますか?あなたのビジネスはボトルネックに遭遇しましたか?方向性がなくてわからない場合は、ドラマを追いかけて行くことを心からお勧めします。(?)ブラフではなく、最も完璧なビジネス例を隠すドラマがあります。2.ブレイキング・バッドとその弁護士ドラマ「ブレイキング・バッド」を見た友人たちは、演劇の中で、穏やかな表情で、弁護士のソウル・グッドマンに深く感銘を受けなければなりません。口を開けて、感覚の弱い傭兵の性格を持っています。道徳の面で、サル・グッドマンは無意識のうちに劇に欠かせない役割を果たし、彼自身のシリーズ「絶望的な弁護士」(ベター・コール・ソール)を生み出しました。ウェントウのテキストとビデオは、劇中のソウル・グッドマンのテレビコマーシャルです。製品(サービス)、競争戦略、市場ポジショニング、ブランド名、ターゲット顧客グループ、コミュニケーション軸から広告まで、サル・グッドマンの役割のビジネス設定は、「最低」と見なすことができる超超超超超超完全です。ブランドコミュニケーションのコスト」「変化」のモデル。なぜ?私の分析をご覧ください。3.ソウル・グッドマンの「事業戦略」1.基本情報ブランド名:Saul Goodman製品:法律相談サービス対象顧客:麻薬中毒、飲酒運転、事故など。法律知識の欠如は、一般的に公立弁護士にしか余裕がなく、真面目な弁護士も「特別な法律を持つ消費者」を避けます。恐れてはいけない「​​ニーズ」。コミュニケーションの主軸:この国のすべての男性、女性、子供は有罪判決を受けるまで無実だと思います。地域:アルバカーキ市スローガン:Thrallに電話したほうがいいです!(ベター・コール・ソール)広告:2つの可能性のある犯罪状況をシミュレートします+サウルの主張+サウルのスローガン2をより適切に呼び出します。

メインネットガイド— Arbitrum Odyssey Week 2

メインネットガイド— Arbitrum Odyssey Week 2

最新のアップデートを受け取るために私たちに従ってください。ニュースレター:https://www。

Language