質問するログイン新規登録

Q&A

解決済

1回答

1130閲覧

.shファイルが実行できない

sake

総合スコア57

Linux

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

2グッド

0クリップ

投稿2024/01/09 09:29

2

0

実現したいこと

1つだけ実行できない「.shファイル」があります。
他の「.shファイル」は実行できます。

発生している問題・分からないこと

sh /usr/local/bin/mail_move.sh

としても、エラー等が返って来ません。

該当のソースコード

mail_move.sh

1#!/bin/bash 2 3files1="/home/main-user/Maildir/new/*" 4if [[ -a $files1 ]]; then 5 for filepath in $files2; do 6 echo $(basename ${filepath}) 7 echo $filepath 8 done 9fi 10 11上記のコードの改行マークを表示してみました。 12#!/bin/bash$ 13$ 14files1="/home/main-user/Maildir/new/*"$ 15if [[ -a $files1 ]]; then$ 16 for filepath in $files2; do$ 17 echo $(basename ${filepath})$ 18 echo $filepath$ 19 done$ 20fi$ 21$ 22

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

インターネットを参照して試してみましたが駄目でした。
mail_move.shに実行権限を与えました。
main-userのアクセス権をrootにしました。
mail_move.shのプロパティ実行できている「.shファイル」と同じにしました。
いろいろと試しましたが、いづれも上手くいきませんでした。

補足

Linuxのバージョンです
NAME="MIRACLE LINUX"
VERSION="8.8 (Peony)"
ID="miraclelinux"
ID_LIKE="rhel fedora"
PLATFORM_ID="platform:el8"
VERSION_ID="8"
PRETTY_NAME="MIRACLE LINUX 8.8 (Peony)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:cybertrust_japan:miracle_linux:8"
HOME_URL="https://www.cybertrust.co.jp/miracle-linux/"
DOCUMENTATION_URL="https://www.miraclelinux.com/support/miraclelinux8"
BUG_REPORT_URL="https://bugzilla.asianux.com/"
MIRACLELINUX_SUPPORT_PRODUCT="MIRACLE LINUX"
MIRACLELINUX_SUPPORT_PRODUCT_VERSION="8"

boya, melian👍を押しています

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

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

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

melian

2024/01/09 10:34

 files1="/home/main-user/Maildir/new/*"  if [[ -a $files1 ]]; then この場合、globbing 文字である *(asterisk)は展開されません。つまり、  if [[ -a /home/main-user/Maildir/new/* ]]; then として処理されるので、/home/main-user/Maildir/new/ ディレクトリ内に * という名前のファイルが存在しなければ if 文の中身は実行されません。 おそらく、以下の様にするのでしょう。 dir="/home/main-user/Maildir/new/" if [[ -d $dir ]];then  for filepath in "$dir"*; do   echo "$filepath"   echo $(basename "$filepath")  done fi
ikedas

2024/01/09 12:40

> for filepath in $files2; do files2 という変数は値を持っていないようなので、このfor文のループは実行されないのでは。
sake

2024/01/10 02:03

melian様へ コメントありがとうございます。 ご指導頂いたようにしてを試しましたが、 /usr/local/bin/mail_move.sh: 行 5: 予期しないトークン `do' 周辺に構文エラーがあります /usr/local/bin/mail_move.sh: 行 5: ` for filepath in "$dir"*; do' 結果は上記のようなエラーが返ってきました。 `do' 周辺をいろいろと修正してみましたが原因が分かりません。 再度ご指導頂けないでしょうか? よろしくお願いします。 ikedas様へ コメントありがとうございます。 間違のご指摘ありがとうございました。 修正して試してみましが結果は変わりませんでした。
melian

2024/01/10 02:07

実はコメント欄ではタブでインデントを付けることができないので、タブの代わりに全角スペースを使用しています。なので、以下をコピーしてインデントを付けてください。 dir="/home/main-user/Maildir/new/" if [[ -d $dir ]];then for filepath in "$dir"*; do echo "$filepath" echo $(basename "$filepath") done fi
sake

2024/01/10 02:19

コメントありがとうございます。 ご指摘通りタブを使ってインデントを付けたら、望み通りの結果を得ることが出来ました。 意外な所に盲点がありました。ありがとうございました。問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか? よろしくお願いします。
melian

2024/01/10 02:22

ありがとうございます、回答へ転記しました。
guest

回答1

0

ベストアンサー

※ コメントから転記

bash

1 files1="/home/main-user/Maildir/new/*" 2 if [[ -a $files1 ]]; then

この場合、globbing 文字である *(asterisk)は展開されません。つまり、

bash

1 if [[ -a /home/main-user/Maildir/new/* ]]; then

として処理されますので、/home/main-user/Maildir/new/ ディレクトリ内に * という名前のファイルが存在しなければ if 文の中身は実行されません。
おそらく、以下の様にするのだと思います。

bash

1dir="/home/main-user/Maildir/new/" 2if [[ -d $dir ]];then 3 for filepath in "$dir"*; do 4 echo "$filepath" 5 echo $(basename "$filepath") 6 done 7fi

投稿2024/01/10 02:22

melian

総合スコア21745

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問