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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

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

Q&A

解決済

1回答

964閲覧

bash:ワイルドカードでディレクトリを指定した際、正式なディレクトリ名を取得したい

piozum

総合スコア11

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

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

0グッド

0クリップ

投稿2022/01/18 03:01

シェルスクリプト:ワイルドカードでディレクトリを指定した際、正式なディレクトリ名を取得したい

【動作環境】:Linux(Ubuntu20.04)

フォルダ

data
|--copy.sh
|--ABC
| |--ABC121
| |--ABC122
| |--ABC123
| |--ABC131
| |--ABC132
| |--ABC133

【期待する動作】:

for文で、ディレクトリの5文字目を判定して表示する。

dir2=ABC121, vowel=a
dir2=ABC122, vowel=i
dir2=ABC123, vowel=u
:
:
のように表示させたい。

【コード内容】:

bash

1for dir1 in data;do 2 for dir2 in ${dir1}*;do 3 five="${dir2:4:1}" 4 if [ "$five" = "1" ];then 5 vowel="a" 6 elif [ "$five" = "2" ];then 7 vowel="i" 8 elif [ "$five" = "3" ];then 9 vowel="u" 10 fi 11 echo dir2="${dir2}", vowel="${vowel}" 12 done; 13 done; 14done;

このとき、表示された結果は以下のようになった。

dir2=ABC*, vowel=
dir2=ABC*, vowel=
dir2=ABC*, vowel=
:
:

(つまりvowelは何も代入されていなかった。)

【試したこと】

ワイルドカードを から?に変更しましたが、
dir2=ABC???
となりました。
また、ディレクトリ名が ABC
となってしまうだけで、実行自体にはなんのエラーもありません。

正式なディレクトリ名を取得する方法を教えていただきたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

data ディレクトリがあるディレクトリで当該のスクリプトを実行するのだとすれば以下の様になるのではないでしょうか。また、「期待する結果」と同じ出力にするには 6 文字目で判定する必要があるかと思います。

bash

1for dir1 in data/*;do 2 test -d "${dir1}" || continue 3 for dir2 in ${dir1}/*;do 4 test -d "${dir2}" || continue 5 dir2=$(basename "${dir2}") 6 five="${dir2:5:1}" 7 if [ "$five" = "1" ];then 8 vowel="a" 9 elif [ "$five" = "2" ];then 10 vowel="i" 11 elif [ "$five" = "3" ];then 12 vowel="u" 13 fi 14 echo dir2="${dir2}", vowel="${vowel}" 15 done; 16 done; 17 18# 19dir2=ABC121, vowel=a 20dir2=ABC122, vowel=i 21dir2=ABC123, vowel=u 22dir2=ABC131, vowel=a 23dir2=ABC132, vowel=i 24dir2=ABC133, vowel=u

投稿2022/01/18 03:18

編集2022/01/18 03:25
melian

総合スコア19712

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

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

piozum

2022/01/18 03:44

ご回答ありがとうございます。 一度相対パス(data/ABC/ABC121)を取得して、basenameでディレクトリ(ABC121)だけを取得したということですね! 解決できてよかったです。 迅速な対応、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問