![打印给定路径中的最后一个字符](https://linux22.com/image/34544/%E6%89%93%E5%8D%B0%E7%BB%99%E5%AE%9A%E8%B7%AF%E5%BE%84%E4%B8%AD%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6.png)
我正在尝试将"comnp.dat_CY*"
文件连接到一个文件中。文件名、源路径和目标路径是参数。我试图找到路径中的最后一个字符来检查它是否是"/"
。但是当我尝试这样做时,我遇到了错误。下面是我的脚本
if [ "$#" -ne 3 ]; then
echo "Script requires 3 inputs"
echo "1. File pattern (comnp.dat_CY)"
echo "2. Source path"
echo "3. Destination path"
exit
fi
last_char1 = `echo $2|awk -F '{if (NF>1) {print $NF}}`
last_char2 = `echo $3|awk -F '{if (NF>1) {print $NF}}`
if [ $last_char1 != "/" ];then
ap_src_path = "$2/"
fi
if [ $last_char2 != "/" ];then
ap_dest_path = "$3/"
fi
cat $ap_src_path$1* > $ap_dest_pathcomnp.dat
以下是我的错误:
comnp.sh: Broken pipe
comnp.sh[14]: last_char1: not found
comnp.sh[15]: last_char2: not found
comnp.sh[17]: test: argument expected
comnp.sh[20]: test: argument expected
我的脚本有什么问题?
我在用ksh AIX
答案1
shell 语法中的变量赋值不允许有空格。 是使用参数和last_char = ...
调用的命令。是存储在 shell 变量中的赋值。last_char
=
....
last_char=...
...
last_char
这是一种更有效、更直接的方式来完成您想做的事情:
case $2 in
*/) ap_src_path=$2;;
*) ap_src_path=$2/;;
esac
case $3 in
*/) ap_dest_path=$3;;
*) ap_dest_path=$3/;;
esac
您不需要提取最后一个字符来进行简单的比较。此外,对于像这样的简单 shell 变量操作,命令替换效率低下且笨拙。
更重要的是,您根本不需要执行任何这些操作。大多数情况下,Unix 路径解析并不关心重复的斜杠,所以path///to//a/file
与 一样有效path/to/a/file
。在脚本中,您只需不用担心重复即可利用这一点/
。换句话说,您可以将整个脚本替换为
if [ $# -ne 3 ]; then
# ... same as above ...
fi
pattern=$1
ap_src_path=$2
ap_dst_path=$3
cat "$ap_src_path/$pattern"* > "$ap_dest_path/compn.dat"
答案2
这里的问题是你不能利用周围的空间=
。 shell对此非常挑剔。而且awk
命令完全有问题。
而且,2014 年比反引号更好用$( )
。所以awk
线路应该是:
last_char1=$(echo "$2" | awk '{print $NF}' FS='')
last_char2=$(echo "$3" | awk '{print $NF}' FS='')
答案3
答案4
您的脚本存在多个问题。周围=
不应出现空格,单引号'
不成对,并且还awk -F
需要一个参数 - 字段分隔符,因此您应该编写awk -F '' '{if (NF>1) {print $NF}}'
.
但事实上,如果你使用任何合理的 shell,比如bash
或者zsh
那么你可以简单地写
cat "${ap_src_path}/${1}*" > "${ap_dest_path}/comnp.dat"
不需要最后一个字符和所有这些if
条件。可能的附加内容/
将被忽略,因此例如路径/var//log///mysql////mysql.log
是完美的语法。