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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

3247閲覧

処理失敗 アラート分岐

coko1

総合スコア276

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2016/11/09 02:42

#!/bin/sh
echo 'コピーを開始します'
cp -p -v コピー元 コピー先
cp -p -v コピー元 コピー先
cp -p -v コピー元 コピー先
echo 'コピーが完了しました'

のようなシェルスクリプトがあるのですが、cpに失敗した場合、
echo 'コピーが完了しました'の部分を
echo 'コピーに失敗しました。'といった具合に分岐させたいのですが、どのような記述をすればよいでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

一つでも失敗したら最後に1回だけ「失敗しました」としたいのでしょうか。
であれば各々の"cp -p"の直後に、

VAL=`expr $VAL + $?`

としてcpコマンドの戻り値を足しこんでいきます。
その後最後に

if [ $VAL -eq 0 ];then echo 'コピーが完了しました' else echo 'コピーが失敗しました' fi

とすればOKです。

投稿2016/11/09 02:51

編集2016/11/09 02:51
ynakano

総合スコア1894

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

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

ynakano

2016/11/09 02:53

細かくて済みませんが1行目は"#!/bin/bash"で…
coko1

2016/11/09 03:32

if [ $VAL -eq 0 ];then の行で unary operator expected とエラーが表示されました。 分岐自体は行なわれているのですが、このエラーはなんでしょうか?
ynakano

2016/11/09 03:40

私の方ではエラーが再現しなかったのですが、もしかすると$VALの部分をダブルクォーテーションで囲ってあげるとエラーが出なくなるかもしれません。
coko1

2016/11/09 06:05

1行目 : #!/bin/bash: No such file or directory if [ $VAL -eq 0 ];then の行 :[: $VAL: integer expression expectedと表示されてしまいました。
ynakano

2016/11/09 06:09

1行目、「#!」の後はbashのフルパスを記載してください。 which bashで探せると思います。 if分のところは以下のようにしてみてください。 if [ "$VAL" -eq 0 ];then
ynakano

2016/11/09 06:13

あ、ごめんなさい。bashではなかったんですね。 1行目は「#!/bin/sh」でも大丈夫です。 ※一応shでもダブルクォートなしで試しましたが、やっぱりエラーは再現しなかったです。 先ほどとエラーメッセージが変わったようですね。 引き続きやってみてダメならスクリプトを見せていただければと思います。
coko1

2016/11/09 06:36

1行目に関してはシェルを作成するタイミングでBOM付きで作成してしまっているためにおこるようです。 [: $VAL: integer expression expected はかわらないですね... #!/bin/sh echo 'コピーを開始します' cp -p VAL=`expr $VAL + $?` -v コピー元 コピー先 ←存在しないファイル cp -p VAL=`expr $VAL + $?` -v コピー元 コピー先 ←存在しないファイル cp -p VAL=`expr $VAL + $?` -v コピー元 コピー先 ←存在しないファイル if [ "$VAL" -eq 0 ];then echo 'コピーが完了しました' else echo 'コピーに失敗しました' fi
ynakano

2016/11/09 06:42

私の書き方が悪かったのでしょうか… 正しくは以下です。 ------------------------------------------- VAL=0 cp -p -v コピー元 コピー先 VAL=`expr $VAL + $?` cp -p -v コピー元 コピー先 VAL=`expr $VAL + $?` cp -p -v コピー元 コピー先 VAL=`expr $VAL + $?` ------------------------------------------- ※最初にVALを初期化しておきました。
coko1

2016/11/09 06:55 編集

出来ました、ありがとうございます。 cp -pの直後と書いてあったので勘違いをしてしまっていました。 1つお聞きしたいのですが $? というのは直前のコマンドの結果を(true,false)1または0で格納されているという認識であっているのでしょうか?
ynakano

2016/11/09 07:07

「直前の」コマンドの戻り値が$?に格納される、という認識は合っています。 取り得る値は0~255ですが、Unix/Linuxのルールとして「正常終了したら0、正常終了でない場合は0以外」です。 0以外についてはエラーの理由ごとに戻り値を複数設定されている場合もありますが、どのような値にするかは実装次第です。
coko1

2016/11/09 07:11

ご丁寧に教えてくださりありがとうございます!とても参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問