【问题标题】:KSH88 variable inside script脚本内的 KSH88 变量
【发布时间】:2019-01-11 01:41:11
【问题描述】:

我在使用 KSH88 时遇到问题

script="find . ! \( "$result" \) -mtime "$older" -xdev -type f -size +"$minsize"M -exec ls -lh {} \; | head -100 | awk '{print \$8}' | sort -rn"

files_to_delete=`$script`

当我回显我的 files_to_delete 变量时,我得到:

find . ! \( -name '*.jar' -o -name '*.zip' -o -name '*.rar' -o -name '*.log' -o -name '*.xml' \) -mtime 10 -xdev -type f -size +100M -exec ls -lh {} \; | head -100 | awk '{print $8}' | sort -rn

这是我想要的,当我在命令行上执行它时它可以工作,但是当我在我的 KSH 中执行它时,我得到了

find: bad option \(
find: [-H | -L] path-list predicate-list

【问题讨论】:

  • 提示:不要使用变量!使用函数或数组来存储命令!
  • 如何将其存储在数组或函数中?我有一个我的异常数组(*.jar *.zip...),但我不知道如何在函数中动态使用 -name 和 -o! P.S 我看了重复的链接,没看懂
  • 请尝试将“eval”放在“$script”前面,这样它就变成了files_to_delete=`eval $script`我没有纯ksh88环境来尝试这个,但它确实在 bash 中有所作为。
  • 为什么不用'(' 替换\(
  • 需要反斜杠转义,因为 find 需要将 ( 和 ) 作为参数。如果删除 \,shell 会尝试解释它。

标签: bash shell solaris ksh


【解决方案1】:

把“eval”放在“$script”前面,这样就变成了

  files_to_delete=`eval $script`

这会强制 shell 评估命令字符串。

如果你的 shell 支持,最好使用files_to_delete=$(eval $script)。 ` 版本在快速扫描脚本时更容易错过,并且更难嵌套(命令中的命令)。

【讨论】:

    猜你喜欢
    • 2015-06-25
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多