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

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

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

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

Automator

Automatorは、作業を自動化するワークフロー構築ソフトウェア。Macに標準で搭載されています。ドラッグ&ドロップ操作で自動化レシピを作成。任意のショートカットキーで実行することが可能です。

MacOS(OSX)

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

Q&A

解決済

1回答

5257閲覧

Automatorのシェルスクリプトでうまくいかない

yuuyu

総合スコア1139

シェルスクリプト

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

Automator

Automatorは、作業を自動化するワークフロー構築ソフトウェア。Macに標準で搭載されています。ドラッグ&ドロップ操作で自動化レシピを作成。任意のショートカットキーで実行することが可能です。

MacOS(OSX)

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

0グッド

0クリップ

投稿2020/02/07 07:18

編集2020/02/07 08:34

Mac標準のAutomatorで、js,cssファイルをminify化させるYuiCompressorを自動化させようとシェルスクリプトを組んでいたのですが、
よく分からないところでつまづいているので、どなたかご教授いただけないでしょうか?

求める結果

shellscript.shに以下のコードを記述

sh

1#!/bin/bash 2f='/Users/username/folder/css/file.css' 3file='/Users/username/folder/css/file.min.css' 4java -jar /Users/username/yuicompressor-2.4.8.jar $f -o $file --charset utf-8

$ source shellscript.sh を実行
ちなみにこの場合はfile.min.cssファイルが生成され実行できます。

###不明な箇所
Automatorで、クイックアクションにて新規作成したのち、
ワークフローが受け取る現在の項目:ファイルまたはフォルダ
検索対象:Finder.app
イメージ:アクション
に設定。
「選択されたFinder項目を取得」(デバッグ目的)
「シェルスクリプトを実行」
→シェル:/bin/bash
→入力の引き渡し方法:引数として

sh

1#!/bin/bash 2for f in "$@" 3do 4 basename=${f##*/} 5 ext=${basename##*.} 6 if [ $ext = "css" -o $ext = "js" ]; then 7 file=${f%.*}".min."$ext 8 java -jar /Users/username/yuicompressor-2.4.8.jar $f -o $file --charset utf-8 9 fi 10done

これで実行してみるとエラーが出力されます。
(実際にはエラーというより、js,cssファイル以外を受け取った際に表示されるデフォルトのものですが。)

なお、途中でecho $fとecho $fileを入れてみたのですが、"求める結果"のfとfileと同じ内容が入っていることを確認しています。

###質問内容
シェルスクリプトに関してはほとんど知識がないため、申し訳ないのですが思いつく対処方法が思いつきません。

Automatorの方法でも動くようにするにはどうすればよろしいでしょうか?

###その他・情報
Mac os 15.10.2(Catalina)
Automator 2.10
YuiCompressor https://github.com/yui/yuicompressor/releases
シェルスクリプト参考サイト https://ameblo.jp/itboy/entry-12259677966.html

###追記
Automatorで以下のコードを実行してみました。

sh

1#!/bin/bash 2for f in "$@" 3do 4 u='/Users/username/folder/css/file.css' 5 for co in {1..35} 6 do 7 if [${f:co:1} = ${u:co:1}]; then 8 echo $co"equal {"${f:co:1}"="${u:co:1}"}" 9 else 10 echo $co"not equal {"${f:co:1}"="${u:co:1}"}" 11 fi 12 done 13 fi 14done

実行結果ですが、
「1not equal{U=U}」
「2not equal{s=s}」
(以下略)

となりました。文字コードが異なるのが原因ということになるのでしょうか?
ただ文字コードの修正方法は未だわかっていないので、もう少し調べてみることにします。

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

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

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

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

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

Y.H.

2020/02/07 08:33

追記の部分について > if [${f:co:1} -eq ${u:co:1}]; then -eq 演算子は数値の比較で文字列の比較には使用できません。 以下のようにするとどうなりますか? if [${f:co:1} = ${u:co:1}]; then
yuuyu

2020/02/07 08:34

すみません先ほど気づいて = で比較していたのですが、やはりnot equalが返ってきました。。
Y.H.

2020/02/07 08:38

あぁもう一つ。 > if [${f:co:1} = ${u:co:1}]; then if [ ${f:co:1} = ${u:co:1} ]; then if の "[" の後ろと "]"の前には半角空白を入れてください。
yuuyu

2020/02/07 08:43

入れてみたところ、全てequalになりました! ただその後if[ $f = $u ]; then(文字列全体で比較)したところ、not equalになりました。
Y.H.

2020/02/07 08:48

ということは$fに36文字目が有りそうですね。
yuuyu

2020/02/07 08:50

自分もそう思い{1..35}のところの数値を大きくしてみた(0-100など)のですが、not equalに分岐する文字列が出ないのです。。
Y.H.

2020/02/07 08:58

非表示文字が入っているんだと思います。 文字長は ${#f} ${#u} でとれるので ループの前(u='/Users/username/folder/css/file.css' の次の行)で echo "f length: "${#f}" / val:#"${f}"#" echo "u length: "${#u} / val:#"${u}"#" としてみてください。 $uと$fで違いがあるはずです。
yuuyu

2020/02/07 09:07

実行コードーーーーーーーーーー #!/bin/bash for f in "$@" do u='/Users/username/folder/css/file.css' echo "f length: "${#f}" / val:#"${f}"#" echo "u length: "${#u}" / val:#"${u}"#" if [ $f = $u ]; then eq="equal" else echo "not equal" fi done ーーーーーーーーー 結果: f length: 122 / val:#/ (省略) u length: 122 / val:#/ (省略) not equal ーーーーーーーーーーー 実機環境とu及びfの変数が異なるので、lengthの値がおかしくはなっていますが、 長さは同じなのに対し、変数比較はnot equalのままになります。
yuuyu

2020/02/07 09:16

根本的な話に戻るのですが、 「不明な箇所」のsh内で doの後ろにf='/Users/username/folder/css/file.css' これを入れて実行しても解決にはならなかったので、問題点はここだけでは無いのかもしれません。。
Y.H.

2020/02/07 09:18

if [ "$f" = "$u" ]; then としてみるとどうなりますか?
yuuyu

2020/02/07 09:31

if [ "$f" = "$u" ]; thenにするとequalになりました!
Y.H.

2020/02/07 09:47

で問題解決なんでしたっけ?
yuuyu

2020/02/07 09:54

「求める結果」に記載されているシェルコードをターミナルで実行すると通常実行できるのに対し、 「不明な箇所」に記載されているシェルコードをAutomatorで実行すると、8行目(java -jarの行)でエラーがおきます。
guest

回答1

0

ベストアンサー

bashのif文の条件に変数を使用する場合は"で括ってください。
[の後と]の前に必ず半角空白 を入れてください。

bash

1if [ "$ext" = "css" -o "$ext" = "js" ]; then 2 # ほげほげ 3fi

投稿2020/02/07 09:44

編集2020/02/07 09:46
Y.H.

総合スコア7918

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

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

yuuyu

2020/02/07 09:47

ありがとうございます。 追記の内容だけをみた場合はこれでベストアンサーにしたいのですが、 「質問内容」に対する解決にはなっていないのです。。。
Y.H.

2020/02/07 09:47

ですよね。
Y.H.

2020/02/07 09:52

java -jar /Users/username/yuicompressor-2.4.8.jar "$f" -o "$file" --charset utf-8 としてみるとか。。。
yuuyu

2020/02/07 09:56

それでした。ダブルクォーテーションで括ると実行できました。 本当にありがとうございます…!
Y.H.

2020/02/07 09:59

良かったです!:-P
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問