如何在linux shell脚本中使用变量遍历路径

如何在linux shell脚本中使用变量遍历路径,linux,bash,shell,unix,scripting,Linux,Bash,Shell,Unix,Scripting,我编写了一个shell脚本来复制当前日期的文件,并将它们放在具有当前日期名称的目标文件夹中,目标文件夹路径包含变量。当我手动运行cd或cp命令时,此路径工作正常,但在shell脚本中,通过cp复制时,无法识别带变量的目录 d=`date +%b' '%d` td=`date +%d%b%Y` cd /filenet/shared/logs mkdir $td cd $td mkdir icn02 icn03 GC cpe01 cpe02 cpe03 cpeb01 cpeb02 icn01 css

我编写了一个shell脚本来复制当前日期的文件,并将它们放在具有当前日期名称的目标文件夹中,目标文件夹路径包含变量。当我手动运行cd或cp命令时,此路径工作正常,但在shell脚本中,通过cp复制时,无法识别带变量的目录

d=`date +%b' '%d`
td=`date +%d%b%Y`
cd /filenet/shared/logs
mkdir $td
cd $td
mkdir icn02 icn03 GC cpe01 cpe02 cpe03 cpeb01 cpeb02 icn01 css01 css02 http01 http02 http03

ssh hostname <<'ENDSSH'
cd /<some_path>
ls -ltrh | grep "$d" | awk {'print $9'} | xargs cp -t /filenet/shared/logs/"${td}"/GC
ENDSSH
我建议更换

$(td)

我建议更换

$(td)


此脚本的更正版本可能更像以下内容:

#!/usr/bin/env bash
#              ^^^^- ksh93 also allowable; /bin/sh is not.

d=$(date '+%b %d')      || exit
td=$(date '+%d%b%Y')    || exit

cd /filenet/shared/logs || exit
mkdir -p -- "$td"       || exit
cd "$td"                || exit
mkdir -p -- icn02 icn03 GC cpe01 cpe02 cpe03 cpeb01 cpeb02 icn01 css01 css02 http01 http02 http03 || exit

# these should only fail if you're using a shell that isn't either bash or ksh93
d_q=$(printf '%q' "$d")   || exit
td_q=$(printf '%q' "$td") || exit

ssh hostname "bash -s ${d_q} ${td_q}" <<'ENDSSH'
d=$1
td=$2
cd /wherever || exit
find . -name "*${d}*" -exec cp -t "/filenet/shared/logs/${td}/GC" -- {} +
ENDSSH
#/usr/bin/env bash
#^^^^-ksh93也允许/bin/sh不是。
d=$(日期'+%b%d')| |退出
td=$(日期'+%d%b%Y')||退出
cd/filenet/shared/logs | |退出
mkdir-p--“$td”| |退出
cd“$td”| |退出
mkdir-p--icn02 icn03 GC cpe01 cpe02 cpe03 cpeb01 cpeb02 icn01 css01 css02 http01 http02 http03 |出口
#只有当您使用的shell不是bash或ksh93时,这些操作才会失败
d|q=$(printf'%q'$d')|退出
td|q=$(printf'%q'$td')||退出

ssh主机名“bash-s${d_q}${td_q}”此脚本的更正版本可能更像以下内容:

#!/usr/bin/env bash
#              ^^^^- ksh93 also allowable; /bin/sh is not.

d=$(date '+%b %d')      || exit
td=$(date '+%d%b%Y')    || exit

cd /filenet/shared/logs || exit
mkdir -p -- "$td"       || exit
cd "$td"                || exit
mkdir -p -- icn02 icn03 GC cpe01 cpe02 cpe03 cpeb01 cpeb02 icn01 css01 css02 http01 http02 http03 || exit

# these should only fail if you're using a shell that isn't either bash or ksh93
d_q=$(printf '%q' "$d")   || exit
td_q=$(printf '%q' "$td") || exit

ssh hostname "bash -s ${d_q} ${td_q}" <<'ENDSSH'
d=$1
td=$2
cd /wherever || exit
find . -name "*${d}*" -exec cp -t "/filenet/shared/logs/${td}/GC" -- {} +
ENDSSH
#/usr/bin/env bash
#^^^^-ksh93也允许/bin/sh不是。
d=$(日期'+%b%d')| |退出
td=$(日期'+%d%b%Y')||退出
cd/filenet/shared/logs | |退出
mkdir-p--“$td”| |退出
cd“$td”| |退出
mkdir-p--icn02 icn03 GC cpe01 cpe02 cpe03 cpeb01 cpeb02 icn01 css01 css02 http01 http02 http03 |出口
#只有当您使用的shell不是bash或ksh93时,这些操作才会失败
d|q=$(printf'%q'$d')|退出
td|q=$(printf'%q'$td')||退出

ssh主机名“bash-s${d_q}${td_q}”ksh不是bash。我使用了#/bin/ksh echo$0。您在heredoc中的
$d
计算为名为
d
的远程变量,而不是该名称的本地变量。不要将
grep
管道传输到
awk
<代码>…|grep模式| awk'{cmd}'
相同awk'/pattern/{cmd}'
.ksh不是bash。我使用了#/bin/ksh echo$0。您在heredoc中的
$d
计算为名为
d
的远程变量,而不是该名称的本地变量。不要将
grep
管道传输到
awk
<代码>…|grep模式| awk'{cmd}'
相同awk'/pattern/{cmd}'
。我也尝试过使用类似$(td),${td}“${td}”,$td手动运行命令时,其工作正常,但是,当放入脚本时,它不起作用OP似乎以某种方式编辑了这个问题,从而删除了使这个答案有意义的上下文。我也尝试过使用类似$(td),${td}“${td}”,以及$td的方法,它在手动运行命令时工作正常,但是,当放入脚本时,它不起作用。OP似乎以某种方式编辑了问题,从而删除了使此答案有意义的上下文。谢谢你,查尔斯,我将尝试此方法并让所有人都知道。谢谢你,查尔斯,我将尝试此方法并让所有人都知道。