2017-03-10 6 views
2

変数の最後から '/'を削除したいので、ファイルがディレクトリへのシンボリックリンクであるかどうか確認できます。私は思っていた方法やオンラインで見つけられる方法を試しましたが、欠けているものはありますか?変数の末尾から '/'を取り除く - bash

ファイルが最後に「/」とシンボリックリンクであるかどうかを確認すると、そのファイルはディレクトリとして扱われます。これは、次のコマンドを実行することで確認できます。

if [ -L symtest/ ] ; then echo "symlink"; fi 

symtestはディレクトリへのシンボリックリンクです。上記は何も出力しません。

私は削除すると「/」、それが正常に動作し、出力は「シンボリックリンク」:

if [ -L symtest ] ; then echo "symlink"; fi 

私の質問があり、それは次のように渡されたときに名前から「/」削除する方法があります変数を関数に変換する?事前に

function is_it_a_symlink() { 
    if [ -L $1 ] ; then 
     echo "This file is a symlink!" 
    else 
     echo "This file is not a symlink!" 
    fi 
} 

ありがとう:

機能は、次のようになります。

+1

注意POSIXの[パス名の解決]その(http://pubs.opengroup.org/ onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13)ルールには、あなたが観察する行動が必要です。 –

+1

@Alexander、資源としてのABSのリンクは避けてください。悪い習慣を見せていることは長年にわたり評判があります。 (無関係な 'function'キーワードを使用します - これはPOSIX shとの互換性を損なうが、標準化された関数宣言構文には価値がない - など)。 –

+1

@Alexander、...実際にリンクしたその特定のページには、より深刻な悪い習慣があります。 './yourscript" foo bar "" baz qux "'と './yourscript foo bar baz qux'を区別して使うことはできません。 'linkchk'関数に引用符がありません(' '$ 1"/* 'と' 'linkchk" $ element "')する必要があります。 –

答えて

3

POSIX-LY、最後/を取り除くためにパラメータ展開を使用して:

${parameter%/} 

をので、あなたのケース:

[ -L "${1%/}" ] 

外部ツール、sed

sed 's_/$__' <<<"$1" 

だから、:

[ -L "$(sed 's_/$__' <<<"$1")" ] 

同様に、awk

awk '{sub("/$", "")} 1' <<<"$1" 

ので:

[ -L "$(awk '{sub("/$", "")} 1' <<<"$1")" ] 
+0

それは完璧に動作します!私は実際に引用符を付けずに早くそれを試みました。ありがとう! –

+0

安全であるためには、おそらく*/*すべての末尾の '/'を削除するべきです。ただ一つあると仮定しないでください。 '$ {1 %% /} ' – chepner

+1

@chepner、... that works?私はそこでシーケンスを照合するためにextglobを使用しなければならないと考えました。実際、私のように見えます。したがって、 'shopt -s extglob'の後には' $ {1 %% +(/)} 'となります。 –

関連する問題