bash单独工作但在屏幕上运行时失败

问题描述 投票:0回答:1

我有这个以bash开头的脚本

for d in /data/mydata/*; do
    echo $d
    filepath=$(echo $d | tr "/" "\n")
    pathArr=($filepath)       # fails here
    echo ${pathArr[-1]}

当我在命令行上调用它时它运行正常

./run_preprocess.sh

但是当我用屏幕运行时

screen -dmSL run_preproc ./run_preprocess.sh

它在那条路径上失败了

./run_preproc.sh: 7: ./run_preproc.sh: Syntax error: "(" unexpected (expecting "done")

我需要做些什么来保护脚本代码?

bash shell gnu-screen
1个回答
1
投票

根据错误,看起来你正在使用POSIX sh运行脚本,而不是bash。数组在POSIX sh中未定义。

要解决此问题,请在脚本中添加适当的hashbang(例如/usr/bin/env bash,或直接使用Bash解释器(例如/bin/bash script.sh)运行脚本)。


此外(与手头的问题无关),您的脚本(或发布的代码段)有几个潜在的问题:

  • 应该引用变量来防止通配和分词(例如考虑d - 你的一个文件 - 包含* - echo $d将包含所有文件的列表,因为*将被扩展)
  • 使用($var)分割成数组是在任何IFS字符上完成的,而不仅仅是换行符。 IFS默认包含空格,制表符和换行符。建议使用read -amapfile而不是($var)

最后,如果您正在尝试获取路径(文件名)中的最后一个组件,则应考虑使用basename(1)

$ basename /path/to/file
file

或者substring removal Bash参数扩展的语法:

$ path=/path/to/file
$ echo "${path##*/}"
file
© www.soinside.com 2019 - 2024. All rights reserved.