提示在bash脚本中输入,然后在脚本中使用它

时间:2015-10-08 22:43:40

标签: linux bash shell

OS: Ubuntu 14.04

我是shell编程的新手(我没有时间成为专家,因为这是我不经常设想做的事情),但我需要在脚本中做一些准备Rails应用程序的东西部署。我有以下脚本:

#!/bin/bash
cd ~
sudo ls -l
read -p $'Enter version of Ruby you want to use, ex: 2.1.7\n' rubyv
if [ "$rubyv" = '' ]; then
  echo 'You did not enter a Ruby version to use, exiting...'
  exit
fi
echo '    You entered '$rubyv
read -rsp $'If this not what you wanted press any key to exit, otherwise, press c to continue\n' -n1 key
if [ "$key" != 'c' ]; then
  exit
fi

然后我想通过使用$ ruby​​v继续使用rvm来安装Ruby,类似于:

rvm install "$rubyv"

对于测试,我尝试输入我创建的目录名,然后将其添加到脚本的末尾:

cd "$rubyv"

但没有任何事情发生。我错过了什么?

解决方案:

看起来cd命令执行正常,但我没有看到它的原因是,当脚本存在时,我返回〜,我开始的目录。我通过在脚本末尾执行ls -l验证我在我所访问的目录中,它确实给了我正确的列表

1 个答案:

答案 0 :(得分:3)

每个shell脚本都在自己的环境中运行。这意味着变量$rubyv仅存在于脚本中。

目录更改只能在脚本内部完成。该脚本启动后,将其环境中的目录更改为HOME cd ~。因此,脚本中的所有命令都是从HOME执行的,例如ls -l(顺便说一句,在您的主目录中执行ls sudo很奇怪。)

脚本终止后,变量$rubyv无效,您回到执行脚本的目录中。

也可以在当前shell中执行脚本而不使用点空间点斜杠创建子shell:

. ./scriptname

在这种情况下,所有命令都将直接在当前shell中执行,因此它将影响当前环境和目录。但是,最好以通常的方式(仅./scriptname)运行辅助脚本以保护当前环境。