bash 脚本美元符号运算符 $ 问题 - 它与 ~ 操作数不兼容吗?

bash 脚本美元符号运算符 $ 问题 - 它与 ~ 操作数不兼容吗?

我是 Linux 环境的新手。快速搜索后,我找不到有关 bash 脚本中使用的 $ 运算符的有用问题。我不知道这个问题是否与 Ubuntu(或其他)Linux 版本有关,或者与我非常少的编程经验有关。

基本上,我认为 Linux 中的 ~ 操作数与字符串“/home/username”完全等同。如果我尝试使用 bash 脚本和外部基于 C 的程序在一定延迟后执行程序,我会陷入困境:我无法使用 ~ 操作数并让程序对用户保持无动于衷(尽管必须尊重文件路径的其余部分)。

请对以下内容提供评论(查找 getIdle 源留给读者):

#!/bin/bash
# call.sh

idle=false
idleAfter=30000     # consider idle after 30000 ms

# EXPLAIN THIS - Begin
# Strings that work
# str_getIdle_exe='/home/seb/Documents/Seb/Prjcts/Idle/getidle/src/getIdle'
# str_getIdle_exe="/home/seb/Documents/Seb/Prjcts/Idle/getidle/src/getIdle"

# Strings that don'work
str_getIdle_exe='~/Documents/Seb/Prjcts/Idle/getidle/src/getIdle'
# str_getIdle_exe="~/Documents/Seb/Prjcts/Idle/getidle/src/getIdle"
# EXPLAIN THIS - End


while true; do
  idleTimeMillis= $str_getIdle_exe
  echo $idleTimeMillis  # just for debug purposes.
  if [[ $idleTimeMillis -gt $idleAfter && $idle = false  ]] ; then
    echo "start idle"   # or whatever command(s) you want to run...
    idle=true
    /usr/bin/xflock4
  else  # just for debug purposes.
    echo "not there yet..."
  fi

  if [[ $idleTimeMillis -lt $idleAfter && $idle = true ]] ; then
    echo "end idle"     # same here.
    idle=false
  fi
  sleep 1      # polling interval

done

我想要解释的是:为什么上面两个不同的字符串在 shell 中执行得很好,但在脚本调用时却不行?

我正在使用 Linux Mint 17.1 “Rebecca” Xfce(64 位)。

非常感谢。

答案1

在引号中时波浪号不会展开——参考:https://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion

因此您想删除引号:

str_getIdle_exe=~/Documents/Seb/Prjcts/Idle/getidle/src/getIdle

如果您的主目录下的路径包含空格,则只需将波浪号保留为不加引号即可:

some_path=~/"dir with spaces/file with spaces"

答案2

波浪号在引号(单引号或双引号)中不会展开。

您有三个选择:

  1. 删除引号:

    string="~/hello"-> string=~/hello(容易受到空白的影响)

  2. 使用命令替换:

    string="~/hello"-> string="$(echo ~/hello)"(较不脆弱)

  3. 按照@steeldriver 的建议,使用HOME环境变量:

    string="~/hello"->string="$HOME/hello"

相关内容