我正在尝试在shell上编写一个脚本,但我仍然坚持一个观点。
我有一个程序每天创建数据并将其放到这样的目录: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)
我尝试了许多其他语法,而不是'
字符放置"
或将其留空。正在删除{
等。但没有改变。
很快,当我在同一行写两个变量($var1 $var2)
时,第二个$
的行为就像转到行的开头并开始覆盖第一个变量。
我一直在寻找,但没有任何相关的内容,或者我找不到任何相关内容,Stackoverflow中有很多解决方案使用$var1$var2
来解决问题
我做错了什么,或者我该如何解决。
我正在使用 FreeBSD 9.0-RELEASE amd64 并使用 sh
任何帮助将不胜感激。
由于
答案 0 :(得分:1)
不知何故,你的命令正在向你的变量引入回车,当变量不是最后一个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
答案 1 :(得分:0)
你很可能在Windows®上使用MinGW或其他一些非常非常Unix的环境,它在行尾(来自Unix PoV)引入了回车(CR,\ r)字符。
所以将此更改为:
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而非附加到当天。