我正在使用以下命令发送电子邮件,它仅在提供所有参数时才有效。
请告知如何处理空/空白变量。例如,如果未提供 -c -b 则忽略。
mailx -a ${ATTACH} -s "$SUBJECT" -c "$CC_MAIL" -b "${BCCMAIL}" -r "${FROM}" "${TO_LIST}"
问候,维拉
我正在使用以下命令发送电子邮件,它仅在提供所有参数时才有效。
请告知如何处理空/空白变量。例如,如果未提供 -c -b 则忽略。
mailx -a ${ATTACH} -s "$SUBJECT" -c "$CC_MAIL" -b "${BCCMAIL}" -r "${FROM}" "${TO_LIST}"
问候,维拉
就在我认为我知道 shell 是如何正常工作的时候,出现了一些让我难过的东西。以下命令在 GNU bash 版本 3.2.25 上执行。
我有几个./configure
脚本,它们都共享一组常见的配置选项,其中一个是CFLAGS
.
为此,我有两个变量
CFLAGS="-fPIC -O3"
COMMON_CONFIGURE_OPTIONS="CFLAGS=\"$CFLAGS\" --enable-static --disable-shared --prefix=$PREFIX"
当它被传递给`./configure'时,它是这样完成的,
"$FOO/configure" $COMMON_CONFIGURE_OPTIONS
对于我的生活,我似乎无法正确扩展它。我已经尝试手动替换$CFLAGS
into的值$COMMON_CONFIGURE_OPTIONS
。我在阳光下尝试了单引号和双引号的所有组合。我什至尝试引用整个“CFLAGS = ...”论点。
我上面给出的版本产生以下(set -x
启用时)
../configure 'CFLAGS="-fPIC' '-O3"' --enable-static --disable-shared --prefix=../install
configure: error: unrecognized option: `-O3"'
Try `../configure --help' for more information
我所期望的,我渴望的,是为了configure
被调用
./configure CFLAGS="-fPIC -O3" --enable-static --disable-shared --prefix="$PREFIX"
我怎样才能实现我想要的,此外,是否有很好的资源/提示可以在未来避免这个问题?
我尝试使用 bash 字符串本机操作来用我的 shell 变量替换字符串。
var1='123'
var2='2018-01-01'
var3='2018-01-02'
var4='myfunction('var1','var2','var3')'
var5=${var4/var1/$var1}
echo $var5
var5=${var5/var2/$var2}
echo $var5
var5=${var5/var1/$var3}
echo $var5
预期输出:
myfunction('123','var2','var3')
myfunction('123','2018-01-01','var3')
myfunction('123','2018-01-01','2018-01-02')
带有混乱字符串的实际输出:
myfunction('123','var2','var3')
myfunction('123','2018-01-01','var3')
')function('123','2018-01-01','2018-01-02
这里最后两个字符在开头移位,我丢失了字符串的前两个字符。我也可以使用 SED。但我只是想弄清楚为什么 bash 原生字符串操作不能按预期工作。是因为我在做多次替换吗?
谢谢你的帮助。
如何用另一个文件中的变量替换文件中的占位符?(就像 docker-compose 正在做的那样。)
我发现很多关于单变量替换或环境变量替换的文章,但不是文件到文件。
.env 文件
name=John
time='10:00'
内容文件
Hello "${name}"! I wait for u since ${time}.
输出文件:
Hello "John"! I wait for u since 10:00.
编辑:请注意,我也想保留"
在文件中。
Edit2:我最终使用了@steeldriver 的解决方案。这是我现在在我的脚本中使用的:
# Make copy of the template folder (containing scripts and `.env` file)
cp -r templates .templates
# Replace environment variables in all files of the folder
set -a
for file in $(find .templates -type f)
do
. ./.env && envsubst < $file > $file.tmp && mv $file.tmp $file
done
set +a
# create output directory
mkdir -p $HOME/output/
# copy if new or modified
rsync -raz .templates/. $HOME/output/
# remove temp folder
rm -r .templates
我有一个运行良好的以下循环:
function uppercase_all_letters() {
for filename in *;
do echo "${filename^^}";
done;
}
如何"${filename^^}"
作为参数提供给函数?
我像往常一样尝试了它(SUBSTITUTION="${filename^^}"
),但随后 Bash 报告:
./test.sh: line 26: ${filename^^}: bad substitution
我想要一个日志功能,它将文件名作为参数并将标准输出复制到所有这些文件。这是我到目前为止提出的:
function logger() {
exec > >(tee -ia /var/log/{log1,log2})
}
当我尝试用 替换{log1,log2}
时{$*}
,我得到用空格分隔的参数。所以,我想我会做这样的事情:
function logger() {
exec > >(IFS=,; tee -ia /var/log{"$*"}
}
这无法做我想要的,因为在进行变量替换之前会发生大括号扩展。所以,我想我可以这样做:
function logger() {
exec > >(IFS=,; eval "tee -ia /var/log/\{$*\}")
}
但这行为相同,即logger one two
创建一个名为{one,two}
.
这是为什么?如何让大括号扩展工作以便tee
写入多个文件?
我正在尝试在 for 循环中导出变量,我希望循环的每次迭代都可以更改要写入的变量。我一直在寻找正确的语法来满足在 bash 中这样的导出,但我尝试过的都没有奏效。这样做的正确方法是什么?
添加更多细节,我希望当循环运行时,我会在第一次运行时导出 FVAR0,在第二次运行时导出 FVAR1,在第三次运行时导出 FVAR2,依此类推。
本来我试过export FVAR$i
export "${!FVAR[$i]}"
是我最近的猜测。
#!/bin/bash
set -x
for i in 0 1 2 3 4
do
export "${!FVAR[$i]}"=$(ls ./run/$i)
done
10:36:10 Thu Jan 24 :: ./uploader.sh
+ for i in 0 1 2 3 4
++ ls ./run/0
+ export =
./uploader.sh: line 5: export: `=': not a valid identifier
+ for i in 0 1 2 3 4
++ ls ./run/1
+ export =
./uploader.sh: line 5: export: `=': not a valid identifier
+ for i in 0 1 2 3 4
++ ls ./run/2
+ export =
./uploader.sh: line 5: export: `=': not a valid identifier
+ for i in 0 1 2 3 4
++ ls ./run/3
+ export =
./uploader.sh: line 5: export: `=': not a valid identifier
+ for i in 0 1 2 3 4
++ ls ./run/4
+ export =
./uploader.sh: line 5: export: `=': not a valid identifier
在 Zsh 参数扩展中,我有:
"${test_var:-"${HOME}/test"}"
但在这里我想检查是否${HOME}/test
存在,如果不存在则test_var
扩展为" "
(一个空格字符串)。
有没有内联解决方案?
这两种变量替换语法可以合二为一吗?
rm "$s_a/$domain.conf" 2>/dev/null
rm "$s_e/$domain.conf" 2>/dev/null
喜欢:
rm "$s_{a,e}/$domain.conf" 2>/dev/null
我有一个 Bash 脚本中的行列表,如下所示
if [ ! -z "$clone01" ]; then git clone "$clone01"; fi
if [ ! -z "$clone02" ]; then git clone "$clone02"; fi
if [ ! -z "$clone03" ]; then git clone "$clone03"; fi
# $clone01 .... through to ... $clone60
if [ ! -z "$clone60" ]; then git clone "$clone60"; fi
当数字小于 10 时,变量末尾的前导零很重要。
我尝试过各种替换和循环等。这段代码非常重复,总共有 60 行。
如何动态创建此代码并使其成为我执行脚本的一部分?解决这个问题的最佳方法是什么?