39699


shell scriptで任意のフォルダの中の.bashファイルの有無を確認して  
任意の存在すればshellscriptのあるフォルダに保存するプログラムを書いています。

その際にフォルダ名に空白があると失敗してしまいます。  
shellscriptののある絶対パスに空白がないフォルダであれば成功しました。

空白に\が付いてしまうのが原因で,pwdで出力した空白に\をつける方法はありますでしょうか？  
また下記のコードで注意する点や改善点などありますでしょうか？

[code]

    #!/bin/bash
    current=$(cd $(dirname $0) && pwd)
    filearray=(".bashrc" ".bash_profile" ".bash_history" "index.html")
    
    for item in ${filearray[@]}; do
      if [ -e $HOME/$item ]; then
        echo "$item found"
        filepath=$HOME/$item
        copy=cp $filepath $current
      else
        echo "$item Not found"
      fi
    done
    
[/code]


CC BY-SA 3.0
2017-11-19T16:26:12.100
39698
2019-05-09T06:27:48.237
2017-11-20T09:36:55.370
26264
26264
question
bash shellscript
フォルダ名に空白があっても動作するシェルスクリプトを書きたい


初めに、配列の定義部分で".bashrc"と".bash_profile"の間だけ`,`が含まれており、このままだとひと続きの要素として認識されていると思うので正しくは

[code]

    filearray=(".bashrc" ".bash_profile" ".bash_history" "index.html")
    
[/code]

* * *

質問に対する回答ですが、if文の中でコピーを行う箇所で、`$current`をダブルクォーテーションで括るのはどうでしょう。

[code]

      if [ -e $HOME/$item ]; then
        echo "$item found"
        filepath=$HOME/$item
        cp $filepath "$current"
      else
    
[/code]


CC BY-SA 3.0
2017-11-19T16:55:56.633
39699
2017-11-19T16:55:56.633
3060
39698
answer


既に回答されている通りでこの場合は変数をクォートしてあげれば解決しますが、何らかの理由で空白をエスケープしたいこともあるかもしません。  
そういう場合は`"${current// /\\ }"`としてあげるとbashのパラメータの展開を利用して実現できます。


CC BY-SA 3.0
2017-11-19T21:29:28.113
39700
2017-11-19T21:29:28.113
25936
39698
answer


古い話題だが、雑なスクリプトすぎてモヤモヤするので、ちゃんと書いておく。

[code]

    #!/bin/bash
    
    set -u
    
    dst=$(cd $(dirname "$0") && pwd) || exit $?
    items=(".bashrc" ".bash_profile" ".bash_history" "index.html")
    
    for item in "${items[@]}"; do
      src="$HOME/$item"
      if [ -e "$src" ]; then
        echo "$item found"
        cp -- "$src" "$dst/"
      else
        echo "$item Not found"
      fi
    done
    
[/code]


CC BY-SA 4.0
2019-05-09T06:27:48.237
54851
2019-05-09T06:27:48.237
3061
39698
answer