首页 > 解决方案 > Bash 变量和空格分隔

问题描述

我正在构建一个脚本,该脚本需要动态生成某些值,将它们存储到变量中,然后将它们用作命令或将值输入到函数中以供以后使用。

问题是一旦最终字符串相当长并且包含空格。我遇到的问题是 shell 认为变量的值只是一个长字符串。所以当试图重用这个值时,shell 认为这是一个有效的单词。

./sql_list_test.sh: line 14: mysql -uroot -pPassword test -B -e  "SELECT LastModified,HeaderLogoImage FROM Merchant LastModified >= '1970-01-01 00:00:00.000'" | sed "/NULL/d ; /N/d ; s//merchantimages///g ; s/.*///g ; /^s*$/d" > /merchantimages_Merchant_HeaderLogoImage.list: No such file or directory

所以字符串格式正确,复制+粘贴到 shell 显示命令工作正常。

你如何使用 bash 来解决这个问题?

不,这不是“您没有将变量放入双引号”的问题

这是如何构建该字符串/变量的示例脚本

#!/bin/bash
MYSQL_CMD='mysql -uroot -pPassword test -B -e'
PREFIX='merchantimages'
SED_CMD="sed \"/NULL/d ; /\\N/d ; s/\/${PREFIX}\///g ; s/.*\///g ; /^\s*$/d\""
TIMESTAMP='1970-01-01 00:00:00.000'

SQL_LIST=$(grep $PREFIX $HOME/sql_cmd_list | envsubst)

while read CMD; do
  echo "Run this: $CMD"
MYSQL_RUN() {
  "$CMD"
}
MYSQL_RUN
done <<< $SQL_LIST

这是 sql_cmd_list 文件中的一行,从中提取值

$MYSQL_CMD "SELECT LastModified,HeaderLogoImage FROM Merchant LastModified >= '$TIMESTAMP'" | $SED_CMD > $FILE_LOCATION/merchantimages_Merchant_HeaderLogoImage.list

标签: linuxbashshellsubstitutioncsv

解决方案


推荐阅读