入力サンプル

入力サンプル

私は試みる:

  1. Bashで入力を受け入れて保存します。文字通りファイルとして
  2. ファイルの内容です。

特殊文字も書かなければなりません文字通りファイルとして。

入力サンプル

./verbatim.sh -a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''

期待される出力

内部一重引用符は維持する必要があります。 ここに画像の説明を入力してください。

-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''

実際の出力

内部引用符が削除されます。

-a smb 'ngrep -i -d $INTERFACE s.?a.?m.?b.?a.*[[:digit:]]'

パスワード

#!/bin/bash
#
# Script Name: verbatim.sh
chars='[ !"#$&()*,;<>?\^`{|}]'
for arg
do
    if [[ $arg == *\'* ]]
    then
        arg=\""$arg"\"
    elif [[ $arg == *$chars* ]]
    then
        arg="'$arg'"
    fi
    allargs+=("$arg")    # ${allargs[@]} is to be used only for printing
done
printf '%s\n' "${allargs[*]}" > /tmp/pse.tmp

cat /tmp/pse.tmp

bashが私が要求したことを実行できるかどうかはわかりません。

読み取りまたはIFSを使用する方が良いですか?私のスクリプトの目的は、特定のサービスへの「クイックリファレンス」として使用されるファイルにユーザー入力を追加することです。

ベストアンサー1

タイトルに関する質問

変数に特定の文字列が含まれている場合、その変数は再び拡張されません(引用されている場合)。

したがって、提案された例のケース(すべて'に変換されます'\''):

var='-a smb '\''ngrep -i -d $INTERFACE '\''s.?a.?m.?b.?a.*[[:digit:]]'\'''\'''

または少し減らすには(実際には必要ありませんが、Continuousを削除する方が良いです''):

var='-a smb '\''ngrep -i -d $INTERFACE '\''s.?a.?m.?b.?a.*[[:digit:]]'\'\'

以下を印刷します(必要な文字列)。

$ echo "$var"
-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''

スクリプトに同じ文字列を提供します。

$ ./verbatim.sh "$var"

if( verbatim.sh) スクリプトは次のようになります。

#!/bin/bash
printf '<%s>' "$@"; echo

次のように印刷されます。

$ ./verbatim.sh "$var"
<-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''>

書いた内容を逐語的に表現した文字列です。

ファイルに書き込む:

その入力をファイルに書き込むには、verbatim.shスクリプトを次のように拡張できます。

#!/bin/bash

printf '<%s>' "$@"; echo
printf '%s\n' "$var" > /tmp/pse.tmp

それから:

$ cat /tmp/pse.tmp
-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''

要求された出力を提供します。

質問

上記は、 "$var" 内の文字列を次のように慎重に扱っているので動作します。一つパラメータではなく文字列です。

  • スクリプトが最初に行うことは、次のパラメータのリストを要求することです。

    for arg do .......
    

    パラメータには1つの文字列しかありません。パラメータリストが必要な場合は、手順は完全に異なる必要があります。

  • 次に、個々のパラメータを二重引用符または一重引用符として引用します。いいえ、それも動作しません。

  • また、提供された文字列の内容を読んでみると、コマンドを設定して実行したいようです。それはさらに悪いです。あなた〜しなければならない読むコマンドを変数に入れようとしましたが、複雑な場合は常に失敗します!

その後、配列をパラメータとして使用するように質問を編集できます。

おすすめ記事