簡體   English   中英

bash-轉義字符以照原樣使用字符串

[英]bash - escape character to take string as is

我在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 psql -a -e -d users -U postgres --no-align -F$'\\t' -c "select * from users limit 1;" > file.ext

解決問題的最佳方法是使用數組:

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[@]}"將擴展到構成數組PSQL的10個“單詞”,並且(雙引號)術語"${QUERY}"將擴展select * from users limit 1;字符串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使用所有大寫的變量名被認為是不好的做法。

你需要確定

  • 制表符實際上存儲在字符串中:
 PSQL="psql -a -e -d users -U postgres --no-align -F"$'\t'" -c"
  • 該bash在評估期間不會忽略選項卡:
OLDIFS="$IFS"
IFS=" "
${PSQL} "${QUERY}" # > ${FILENAME}
IFS="$OLDIFS"

bash使用IFS (內部字段分隔符)分隔各個參數,並且默認情況下包含制表符。 您可以通過鍵入od -abc <<< "$IFS"

解決方案非常簡單,只需碰巧最后一行即可:

eval "${PSQL} '${QUERY}' # > ${FILENAME}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM