[英]shell $ character overwrites the previous variable
我正在尝试在shell上编写脚本,但遇到了麻烦。
我有一个程序每天创建数据并将其home/meee/data/2013/07/22/mydata
这样的目录中: home/meee/data/2013/07/22/mydata
我的问题是我想使用日期更改目录。 这是我的脚本:
#!/bin/sh
x=$(date -u -v-2H "+%Y-%m-%d")
echo $x
year=$(echo $x | cut -d"-" -f1)
month=$(echo $x | cut -d"-" -f2)
day=$(echo $x | cut -d"-" -f3)
echo $year
echo $month
echo $day
d1='/home/sensor/data/'${year}/${month}
echo $d1
与year, day, month
无关,他们在工作。 但是echo d1
的输出是/07me/sensor/data/2013
。 同样,当我编写echo $year$day
它得到2312 (characters of day is overwritten on the first two characater of the year)
我尝试了许多其他语法,例如代替'
character put "
或将其保留为空。删除{
等等。但是什么都没有改变。
不久,当我在同一行中写入两个变量($var1 $var2)
,第二个$
行为类似于转到该行的开头并开始覆盖第一个变量。
我一直在寻找,但没有与此相关的东西,或者我找不到任何相关的东西,并且在Stackoverflow中有很多解决方案可以使用$var1$var2
解决该问题
我在做什么错,或者我该如何解决。
我正在使用FreeBSD 9.0-RELEASE amd64并使用sh
任何帮助将不胜感激。
谢谢
不知何故,您的命令正在将回车符引入变量,当变量不是最后echo
的变量时,这将影响输出。 您可以通过将值传递给hexdump
或od
来确认这一点:
printf "%s" "$x" | hexdump -C # Look for 0d in the output.
printf "%s" "$year" | hexdump -C # Look for 0d in the output.
printf "%s" "$month" | hexdump -C # Look for 0d in the output.
printf "%s" "$day" | hexdump -C # Look for 0d in the output.
我认为这不会解决问题,但是您可以得到年,月和日,而无需花费太多外部程序:
IFS=- read year month day <<EOF
$(date -u -v-2H "+%Y-%m-%d")
EOF
或更简单
read year month day <<EOF
$(date -u -v-2H "+%Y %m %d")
EOF
您可能在Windows®上使用MinGW或其他非Unix环境,该环境在行尾引入了回车符(CR,\\ r)(来自Unix PoV)。
因此,将其更改为:
x=$(date -u -v-2H "+%Y-%m-%d" | sed $'s/\r$//')
echo $x
year=$(echo $x | cut -d"-" -f1 | sed $'s/\r$//')
month=$(echo $x | cut -d"-" -f2 | sed $'s/\r$//')
day=$(echo $x | cut -d"-" -f3 | sed $'s/\r$//')
或者,甚至更好:
x=$(date -u -v-2H "+%Y %m %d ")
echo $x
set -- $x
year=$1
month=$2
day=$3
请注意%d之后的多余空间,以确保CR变为$ 4,而不是固定在当天。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.