
Appleショートカットアプリは簡単にプログラムが組めますが、独特の対話型UIのため特に(シェルスクリプトから実行)アクションに引き継ぐマジック変数の扱いが良く理解出来ませんでした。 今回、ファイル操作するプログラムを具体例としスクリプトアクションへの変数の取扱いを中心に自分自身の体験を踏まえて分かり易く解説したいと思います。
なお、今回使用するサンプルショートカットプログラムは、以前紹介した下記の参照記事をベースに解説用として再構成したものです。
-
-
参照記事Macショートカットアプリを使った「ファイル名をtxtファイルに保存する」ショートカットの作成
Finderでファイルを複数選択してコピーした後、txtファイルを開いてペーストするとフルパスでファイル名が保存出来ます。 しかし、ファイル名だけにするには、ディレクトリ部分を消す必要があります。 こ ...
🪄 マジック変数の基本
各アクションは実行結果(出力)を持ち、その出力は後続のアクションからマジック変数として参照できます。
このマジック変数をもらう(参照する)には、各アクションや挿入したい場所を右クリック(又はControlキーを押しながらクリック)すると各アクションの下にマジック変数(青いトークン)が現れるので、受け取りたい変数をクリックします。
以上の様に対話型UIとして変数の受け渡しを行う方式ですので、この点が通常のスクリプトにある様な変数(ex. x = foo)を定義する方式で無いのでこれが混乱を招く要因です。
マジック変数のプロパティについて
マジック変数(青いトークン)をクリックすると、選択・ダイアログが表示され、変数の名前やプロパティ(属性)を変更できます。
- マジック変数の名前は、デフォルトでは、ショートカットアプリが最適と思われる変数名になっています。 変数の名前を変えるには、変数名:の入力欄に変更したい名前を入れると、該当する全部のマジック変数名が変わります。
- 属性を変えたい時、例えば、「ファイルを選択」アクションの出力は、多くのデータ(名前、パス、日時など)が含まれています。 引き渡すデータを選択できますので、ファイルの作成日だけを受け取りたい時は、入手:の「作成日」を選択します。
例えば、「ファイルを選択」アクションの場合で拡張子付きのファイルを選ぶことが出来ません。 この場合は、(シェルスクリプトから実行)アクションを使って basenameで拡張子付きのファイルを取得するのが手っ取り早く処理できます。
(シェルスクリプトを実行)アクションにマジック変数を渡す方法
マジック変数で、(シェルスクリプトから実行)アクションへ簡単に変数を引き渡すことができます。 今回使用した(シェルスクリプトから実行)アクションを実例に説明します。
下の例の、1行目の selected_item="選択した項目" に着目してください。 これは、変数:selected_itemに(リストア)クションで選択した マジック変数 "選択した項目" を入れています。 これで、シェルスクリプト内で 変数:selected_item が使用出来るようになります。
注意:=(等号)の前後へのスペース␣はNGです。→ NG ✗ selected_item␣=␣"選択した項目"
ここが、ポイント
マジック変数の入れ方は、selected_item="" ダブルクォーテーションで囲まれている箇所に、右クリック(又はControlキーを押しながらクリック)すると各アクションの下にマジック変数(青いトークン)が現れるので、受け取りたい変数を選んでクリックしますと、ダブルクォーテーションで囲まれている箇所にマジック変数が挿入されます。 なお、" " ダブルクォーテーションの意味は、受け取る変数が文字列だからです。
このマジック変数の挿入方法は、(シェルスクリプトから実行)アクションだけで無く、例えば(テキスト)アクション内の文字列や(アラート)アクション内の文字列にも同じ様にマジック変数が挿入できます。
【参考】公式(Apple サポート)の変数の解説ページ
公式(Apple サポート)の解説は、残念ながら文章による説明のみで具体例に欠け、あまり参考になりませんでしたが、下記に、公式(Apple サポート)の変数の解説ページ(リンク)を示します。
マジック変数を使った具体例:【ファイル名の取得 リスト選択】作成手順
ショートカットアプリを使った【ファイル名の取得 リスト選択】プログラムの作成手順を示します。 マジック変数と必要事項をフォーカ(特記)しています。
プログラム概要
作成した 名前:【ファイル名の取得 リスト選択】プログラムを実行すると
Finderが表示され、ファイルを複数選択した後、求めるファイル形式別に、①フルパスリスト、②拡張子を含んだファイル名リスト、③audiojs用:HTMLベースのplaylistの項目を選んで、目的別のリストを出力(.txt保存)させると言うものです。
audiojsは、HTMLに埋め込むことができるAudioプレヤーで、プレイリストも表示できます。 詳しくは、ここをクリックして参照してください。
使用アクションの配置
ショートカット・アプリを起動して「ファイル」>「新規ショートカット」をクリックすると、まっさらなショートカット編集画面が現れます。 キーワード検索して当該アクションをドラッグして配置します。
| 配置するアクション名 | 備考(プロンプト等) |
| (ファイルを選択) | 複数に選択:にレ点 |
| (リスト) | 3項目を記入する 【フルパス List】【ファイル名 List】【HTML形式 PlayList】 |
| (リストから選択) | プロンプト:「保存したい ファイル 形式を選択」を記入 |
| (シェルスクリプトから実行) | シェル:bash、入力: ファイル 【マジック変数】 入力を渡す方法:引数として |
| (ファイルに保存) | 保存先を尋ねる:空 にして、サブパス:file_list.txt、上書き:レ点 |
| (アラートを表示) | タイトル: 選択した項目 【マジック変数】をデスクトップに file_list.txtで保存しました。 |
| (ファイルを開く) | 「テキストエディット」アプリを選択してで開く |

下記に、(シェルスクリプトから実行)のシェルスクリプト(bash)コードを示します。 必要な方は、コピペしてください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
selected_item="選択した項目" # ← ここにマジック変数を挿入します。 echo $selected_item echo # 1行 改行 for f in "$@"; do case $selected_item in "【フルパス List】") printf '%s\n' "$f" ;; "【ファイル名 List】") printf '%s\n' "$(basename "$f")" ;; "【HTML形式 PlayList】") file_name=$(basename "$f") printf '<li class="last"><a data-src="%s">%s</a></li>\n' \ "$file_name" "${file_name%.*}" ;; esac done |

完成プログラムのビデオ
下のビデオは、完成した【ファイル名の取得 リスト選択】プログラムを実行し、Finderからファイルを選択し、ファイル形式のリスト中の【HTML形式 PlayList】を選択した後、保存されたテキストファイルが表示されるまでの動画です。



