2017-10-10 5 views
3

[OK]を私は、パラメータとして文字列を持つことになります機能を持っており、それが出力はどんなスペースを持っていないこと新しい文字列'"バッシュは - "を持っているファイルの名前を変更でそれ

function rename_file() { 

local string_to_change=$1 
local length=${#string_to_change} 
local i=0 
local new_string=" " 
local charac 

for i in $(seq $length); do 
    i=$((i-1)) 
    charac="${string_to_change:i:1}" 

    if [ "$charac" != " " ] && [ "$charac" != "'" ] && [ "$charac" != """ ]; then #Here if the char is not" ", " ' ", or " " ", we will add this char to our current new_string and else, we do nothing 

     new_string=$new_string$charaC#simply append the "normal" char to new_string 

    fi 

done 

echo $new_string #Just print the new string without spaces and other characters 
} 

しかし、私はちょうどそれだけでは動作しませんので、charが"であるかどうかを調べる。そして、私は

と私の関数を呼び出す場合はすることはできません

それはちょうど>を開き、何かを入力するのを待つ..どんな助け?

+0

rename_file(ファイル "n am_e") –

+0

rename_file(ファイル "n ame")を入力(またはスクリプトを入力)した場合、関数 'rename_file'を引数' file 'n ame'というよりむしろ文字列の始めを入力していて、bashはあなたにプロンプ​​トを表示して文字列を終了させるのを待っています' rename_file file \ "n ame' –

+0

純粋なbash解、代わりに1ライナーを提案してもいいですか? '$ 'を' $'に変更してください: 'new_string = $(echo $ string | sed -e 's///' -e 's /、//' -e 's /" //' – favoretti

答えて

5

名前を一重引用符で囲みます。

rename_file 'file"n am_e' 

そして、あなたは、単一引用符をテストしたい場合は、二重引用符でそれを置く:

rename_file "file'n am_e" 

二重引用符でそれらを入れて、内側の二重引用符をエスケープし、両方をテストするには:

rename_file "file'na \"me" 

もう1つの方法は、変数を使用することです。

quote='"' 
rename_file "file'na ${quote}me" 

また、シェル関数の引数の前後にカッコを入れる必要はありません。それらは普通のコマンドと同じように呼び出され、引数は同じコマンドラインでスペースで区切られています。

文字を置き換えるためにループを実行する必要はありません。

new_string=${string_to_change//[\"\' ]/} 

この構文の説明については、BashマニュアルのParameter Expansionを参照してください。

+2

私はOPが実際にファイル名に括弧を必要としないと思うし、関数呼び出しで必要ではないことを指摘すると役に立つかもしれません –

+0

ああ、これは実際にはかなりクールです! OPへのコメントにsedベースのソリューションを提供しました。 – favoretti

+0

@WilliamPursellありがとう、答えを – Barmar

関連する問題