0

bash に次のスクリプトがあります。

#!/bin/bash
PSQL="psql -a -e -d users -U postgres --no-align -F$'\t' -c"
FILENAME="file.ext"
QUERY="select * from users limit 1;"
${PSQL} "${QUERY}" # > ${FILENAME}

でも、-F$'\t'評価が違う。文字列が評価されて別の文字列が返されないようにするにはどうすればよいですか。つまり、最終的に次のようにコマンドを実行したいとします。psql -a -e -d users -U postgres --no-align -F$'\t' -c "select * from users limit 1;" > file.ext

4

3 に答える 3

1

問題を解決する最善の方法は、配列を使用することです。

PSQL=( psql -a -e -d users -U postgres --no-align $'-F\t' -c )
FILENAME="file.ext"
QUERY="select * from users limit 1;"
"${PSQL[@]}" "${QUERY}" # > ${FILENAME}

説明。最初の行は、PSQL という名前の新しい配列を定義します。次のように考えることができます。

PSQL[0] = psql
PSQL[1] = -a
PSQL[2] = -e
PSQL[3] = -d
PSQL[4] = users
PSQL[5] = -U
PSQL[6] = postgres
PSQL[7] = --no-align
PSQL[8] = -F<tab>
PSQL[9] = -c

最後の行で、(二重引用符で囲まれた) 用語"${PSQL[@]}"は、配列を構成する 10 個の「単語」に展開さPSQLれ、(二重引用符で囲まれた) 用語は、単一の単語と見なされる"${QUERY}"文字列に展開されます。select * from users limit 1;より明確にするために、展開がどのように機能するかを示し、行を展開するときに bash が参照する各引数をグループ{化します。}"${PSQL[@]}" "${QUERY}"

{ psql } { -a } { -e } { -d } { users } { -U } { postgres } { --no-align } { -F<tab> } { -c } { select * from users limit 1; }

述べる。ですべて大文字の変数名を使用することbashは、悪い習慣と見なされます。

于 2012-11-25T09:34:09.043 に答える
-1

あなたは確認する必要があります

  • タブ文字が実際に文字列に格納されていること:
 PSQL="psql -a -e -d users -U postgres --no-align -F"$'\t'" -c"
  • そのbashは評価中にタブを無視しません:
OLDIFS="$IFS"
IFS=" "
${PSQL} "${QUERY}" # > ${FILENAME}
IFS="$OLDIFS"

IFS内部フィールドセパレーター)は、bashが個々のパラメーターを区切るために使用し、デフォルトでタブ文字を含みます。と入力すると、それを確認できますod -abc <<< "$IFS"

于 2012-11-25T10:08:39.707 に答える
-2

解決策は非常に単純です。最後の行をたまたま次のようにします。

eval "${PSQL} '${QUERY}' # > ${FILENAME}"
于 2012-11-25T09:43:25.450 に答える