当前位置: 首页 > 面试题库 >

为什么路径脚本中的波浪号没有在Shell脚本中扩展?

敖涵容
2023-03-14
问题内容

我试图让Android
Studio启动器(studio.sh)使用手动安装的Java(而不是系统范围的默认Java)。由于我已经在.bashrc文件中声明了PATH和JAVA_HOME,因此我只是在shell脚本中提供了该文件:

。/home/foobar/.bashrc

但是由于某些原因,该脚本仍无法将$ JAVA_HOME / bin / java识别为可执行文件。

我添加了一些日志记录,发现JAVA_HOME已扩展为〜/ install / java …,即,代字号运算符未扩展至主目录。

我进行了一些搜索,但找不到任何未扩展的原因。波浪号是否是Bash特有的功能(脚本使用#!/ bin / sh,Linux
Mint使用破折号而不是bash)?波浪号在某些情况下不起作用吗?

我在.bashrc声明中用$ HOME替换〜,然后它起作用了,因此在运行时就知道HOME了。


问题答案:

在bash手册中,请注意 参数替换 过程 中括号的扩展,但不是递归的:

扩展顺序为:大括号扩展;波浪号扩展,参数和变量扩展,算术扩展和命令替换(以从左到右的方式完成);分词 和文件名扩展。

这意味着在bash变量中未扩展存储的任何代字号(或参数引用或命令替换)都 不会自动解析
。您的JAVA_HOME变量包含文字波浪号,因此bash不会自动对其进行扩展。

您的修复很可能有效,因为波浪号扩展名不适用于引号:

$ echo "~"
~
$ echo ~
/home/jeffbowman

…但是参数扩展$HOME确实会出现在引号中。 在分配JAVA_HOME期间 ,用$ HOME替换它会扩展到您的主目录。

FOO=~/bar        # stores /home/jeffbowman/bar
FOO="~/bar"      # stores ~/bar
FOO=$HOME/bar    # stores /home/jeffbowman/bar
FOO="$HOME/bar"  # stores /home/jeffbowman/bar


 类似资料:
  • 问题内容: 这是我的脚本: 在“ read caminho”中,我可能会从用户那里收到〜/ somefolder之类的路径。当脚本接收到这样的路径时,mv和mkdir都不会进行波浪号扩展,因此它将尝试创建〜/ somefolder而不是/ home / username / somefolder,因此失败。 如何确保将波浪号转换为HOME变量? 问题答案: 您可能需要评估该变量以正确替换它。一个例

  • 我理解单引号和双引号的用法。 但是我不知道剧本中需要双引号。 这种说法没有区别 请告诉我普通引号和双引号之间的区别。

  • 问题内容: 我正在看这段代码。我想知道以下代码段的含义 。 在一个问题中,它说代表字符串,但这是在Perl中。这里也一样吗? 此外,我想知道该变量是否自动更新。它已被初始化为开始时,但后来如何递增? 问题答案: 检查左操作数的值是否小于或等于()右操作数的值,如果是,则条件为true。 考虑: 那是真的。

  • 本文向大家介绍什么是Shell脚本?,包括了什么是Shell脚本?的使用技巧和注意事项,需要的朋友参考一下 Shell脚本是由Unix Shell(是命令行解释器)运行的计算机程序中的命令列表。Shell脚本通常具有描述步骤的注释。Shell脚本执行的不同操作是程序执行,文件操作和文本打印。包装器也是一种Shell脚本,用于创建程序环境,运行程序等。 贝壳类型 Unix中有两种主要的Shell类型

  • 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch test_$i.txt done 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 第2行:切换到当前用户的home目录 第3行:创建一个目录shell_tut 第4行:切换到s

  • 问题内容: 在shell脚本中,美元符号后跟at符号()是什么意思? 例如: 问题答案: 是传递给脚本的 所有 参数。 举例来说,如果你打电话,然后将等于。 如果您这样做: 然后里面引用: 该参数将传递给每个参数,并用双引号引起来,从而允许调用者从空格中获取参数并将其传递。