質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

2回答

1254閲覧

zshの自作関数で引数に連想配列を使いたい。

jack1121alpha2

総合スコア14

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

0クリップ

投稿2021/05/20 07:40

編集2021/05/22 14:30

Macのdefaultsコマンドを設定する際に
連想配列に入れた値と自作関数を使って1コマンドで値を設定できないかと思って
下記のようなものと作りましたが、

function setdefaults () { local plist=$1 local args=$2 for arg in ${(k)args}; do defaults write $plist $arg $args[$arg] done } local -A args args=( alwaysDisableWithBattery 1 autoModeEnabled 1 ) setdefaults com.hoge.plist $args

うまく動かず以下のエラーが表示されます。

defaults[47361:2115373]
Rep argument is not a dictionary
Defaults have not been changed.

公式サイトのドキュメントを読んだり検索もしてみたのですが、
当たり前すぎるのか、またはzshでは違った
アプローチを取るのか、思ったような情報を見つけることができませんでした。

関数にせず以下のように書けば希望する動きになったので
引数の設定の仕方が悪いのではないかと考えています。

local -A args args=( alwaysDisableWithBattery 1 autoModeEnabled 1 ) for arg in ${(k)args}; do defaults write com.hoge.plist $arg $args[$arg] done }

初歩的な質問だとは思うのですが、
ご存知の方がいらっしゃいましたらお力お借りできれば幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

引数で渡せるのは文字列だけです。

案1:名前を渡してグローバル変数を参照する。
ただし処理内で'を使っていると面倒。

Zsh

1function setdefaults () { 2 local plist=$1 3 eval 'for arg in ${(k)'$2'}; do 4 defaults write $prist $arg $'$2'[$arg] 5 done' 6} 7 8local -A args 9 10args=( 11 alwaysDisableWithBattery 1 12 autoModeEnabled 1 13) 14 15setdefaults com.hoge.plist args

案2:文字列化して渡す。dodaさん回答の改善。

Python

1function setdefaults () { 2 local plist=$1 3 eval local -A args=($2) 4 for arg in ${(k)args}; do 5 defaults write $plist $arg $args[$arg] 6 done 7} 8 9local -A args 10 11args=( 12 alwaysDisableWithBattery 1 13 autoModeEnabled 1 14) 15 16setdefaults com.hoge.plist "${(kv)args}"

投稿2021/05/20 10:42

otn

総合スコア84542

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jack1121alpha2

2021/05/22 14:35

ご回答ありがとうございます。おかげさまで希望の動きを実現することができました。 ベストアンサーに関しては先にご提案いただいたdodaさんの回答につけるか迷いましたが、 otnさんのコードの方が自分的には読みやすかったためこちらをベストアンサーとさせていただきました。
guest

0

連想配列は直接は渡せないのではないかと思います。

例えば以下のように展開して渡し、受け側で連想配列に格納するのはどうでしょうか?

zsh

1function setdefaults () { 2 local plist=$1 3 local -A args=($@[2,-1]) 4 for arg in ${(k)args}; do 5 defaults write $plist $arg $args[$arg] 6 done 7} 8 9local -A args 10 11args=( 12 alwaysDisableWithBattery 1 13 autoModeEnabled 1 14) 15 16setdefaults com.hoge.plist ${(kv)args}

この方法だと、以下のような制限が有ります。

  • 連想配列は一つだけしか渡せない
  • 連想配列は最後に渡す必要がある

多分$prist$plistの間違いですよね?

投稿2021/05/20 10:03

doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jack1121alpha2

2021/05/22 14:34

ご提案ありがとうございます。仰る通り$pristは$plistの間違いでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問