如何在字符串连接中包含破折号(或其他特殊字符)?
How to include dashes (or other special characters) in string concatenation?
所以这可能是一个基本且微不足道的问题,但我正在努力解决 dash/minus (-) 在字符串连接中的用法。 (实际上还有其他符号,如低杆等。)
说,我有 3 个变量:
var1="${otherstring:0:4}"
var2="${otherstring:4:2}"
var3="${otherstring2:6:2}"
我想通过以下方式融合它们:
datap1="$var1$var2"-"$var3"
中间插入破折号。
问题是我的输出在破折号之后被截断了:
var1var2-
我做错了什么?
编辑 - 添加代码:
#! /bin/sh -
find . -type f -mtime -7 | sed "s|^\./||" | xargs -n1 gunzip
var1=$(ls -t *.log | head -n1 | sed 's/.log$//' | egrep -o '.{1,8}$')
var2=$(ls -t *.log | tail -n1 | sed 's/.log$//' | egrep -o '.{1,8}$')
any1="${var1:0:4}"
any2="${var2:0:4}"
mes1="${var1:4:2}"
mes2="${var2:4:2}"
dia1="${var1:6:2}"
dia1="${var2:6:2}"
if [ "$any1" == "$any2" ]; then
if [ "$mes1" == "$mes2" ]; then
datap1="$any1$mes1$dia1"-"$dia2"
else
datap1="$any1$mes1$dia1"-"$mes2$dia2"
fi
else
datap1="$any1$mes1$dia1"-"$any2$mes2$dia2"
fi
/usr/local/exim/bin/eximstats -nr -t0 -nt -xls *.log > stats_01_"$datap1".xls
find . -type f -name "*.log" | sed "s|^\./||" | xargs -n1 gzip
而我 运行 作为 .sh 文件。
[代码的第一部分只是获取字符串操作的必要部分,日志名称末尾包含日期。日志文件的类型为 "foo_bar_foo_20190410.log"。 if 循环只是某个日期 comparison/sorting.]
你的代码符合我的预期。
您甚至不需要将破折号放在引号外,这也适用:
datap1="$var1$var2-$var1"
您需要做一些特殊的事情的情况是,是否允许分隔符作为变量名的一部分,例如下划线。如果你写
datap1="$var1$var2_$var1"
它将尝试查找名为 var2_
的变量,但会失败,因此不会替换任何内容;该值将为 var1var1
。您可以用大括号括住变量名来分隔它:
datap1="$var1${var2}_$var1"
所以这可能是一个基本且微不足道的问题,但我正在努力解决 dash/minus (-) 在字符串连接中的用法。 (实际上还有其他符号,如低杆等。)
说,我有 3 个变量:
var1="${otherstring:0:4}"
var2="${otherstring:4:2}"
var3="${otherstring2:6:2}"
我想通过以下方式融合它们:
datap1="$var1$var2"-"$var3"
中间插入破折号。
问题是我的输出在破折号之后被截断了:
var1var2-
我做错了什么?
编辑 - 添加代码:
#! /bin/sh -
find . -type f -mtime -7 | sed "s|^\./||" | xargs -n1 gunzip
var1=$(ls -t *.log | head -n1 | sed 's/.log$//' | egrep -o '.{1,8}$')
var2=$(ls -t *.log | tail -n1 | sed 's/.log$//' | egrep -o '.{1,8}$')
any1="${var1:0:4}"
any2="${var2:0:4}"
mes1="${var1:4:2}"
mes2="${var2:4:2}"
dia1="${var1:6:2}"
dia1="${var2:6:2}"
if [ "$any1" == "$any2" ]; then
if [ "$mes1" == "$mes2" ]; then
datap1="$any1$mes1$dia1"-"$dia2"
else
datap1="$any1$mes1$dia1"-"$mes2$dia2"
fi
else
datap1="$any1$mes1$dia1"-"$any2$mes2$dia2"
fi
/usr/local/exim/bin/eximstats -nr -t0 -nt -xls *.log > stats_01_"$datap1".xls
find . -type f -name "*.log" | sed "s|^\./||" | xargs -n1 gzip
而我 运行 作为 .sh 文件。
[代码的第一部分只是获取字符串操作的必要部分,日志名称末尾包含日期。日志文件的类型为 "foo_bar_foo_20190410.log"。 if 循环只是某个日期 comparison/sorting.]
你的代码符合我的预期。
您甚至不需要将破折号放在引号外,这也适用:
datap1="$var1$var2-$var1"
您需要做一些特殊的事情的情况是,是否允许分隔符作为变量名的一部分,例如下划线。如果你写
datap1="$var1$var2_$var1"
它将尝试查找名为 var2_
的变量,但会失败,因此不会替换任何内容;该值将为 var1var1
。您可以用大括号括住变量名来分隔它:
datap1="$var1${var2}_$var1"