打印给定路径中的最后一个字符

打印给定路径中的最后一个字符

我正在尝试将"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='')

查看http://mywiki.wooledge.org/BashFAQ/082

答案3

last_char1=$(echo ${2:${#2}-1}); 
last_char2=$(echo ${3:${#3}-1}); 

if [[ "$last_char1" != "/" ]]; then 

尖端:

  • 使用 $(命令),而不是旧的 `命令`:参考
  • 使用 [[ ]] 代替 [ ]:参考

答案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是完美的语法。

相关内容