bash脚本中的$ 1和“ $ 1”有什么区别?

时间:2018-06-30 03:14:40

标签: bash

示例

while [ -n "$1" ]
do
  something
done

我可以写$1而不是"$1"吗?和之间有什么区别 user=alexanderuser="alexander"?谢谢

2 个答案:

答案 0 :(得分:4)

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var checkMarkButton: UIButton!

    let save = "save"

    override func viewDidLoad() {
        super.viewDidLoad()
         if UserDefaults.standard.bool(forKey: "save") == true {
            checkMarkButton.setImage(#imageLiteral(resourceName:                                                   "greyChecked"), for: .normal)

        }else{

            checkMarkButton.setImage(#imageLiteral(resourceName:  "greyUnchecked"), for: .normal)

        }
     }




    @IBAction func checkMarkAction(_ sender: UIButton) {
          UserDefaults.standard.set(true, forKey: "save")
    }


}

$ A和“ $ A”之间的区别是在将参数传递给程序和函数方面如何处理断字。

想象一下处理文件的脚本(例如,将它们移动):

$ var="two words"
$ function num_args() { echo "${#}"; }
$ num_args $var
2
$ num_args "$var"
1
$ cat my-move
#! /bin/sh
# my-move

src=${1}
dst=${2}

# ... do some fancy business logic here

mv ${src} ${dst}

按现在的代码显示(无引号),此脚本已损坏,因为它将无法正确处理其中包含空格的文件路径。

(感谢@CharlesDuffy)

在处理全局模式时,另外要引用的内容:

$ my-move "some file" other/path

或者:

$ var='*'
$ num_args "$var"
1
$ num_args $var
60

答案 1 :(得分:1)

引号用作对参数进行分组的一种方法,而不管是否存在空格或其他特殊字符。作为演示,在两种情况下存在实质性差异的情况:

$ foo="bar baz"
$ sh -c 'echo $1' worker $foo
bar
$ sh -c 'echo $1' worker "$foo"
bar baz

在上面的示例中,我们传递了不带引号的$foo,它传递了bar作为参数1和baz作为参数2,但是当我们使用引号传递时,它传递了{{1} }作为参数1。

因此,尽管您可以编写一个不带引号的变量(例如bar baz),但是通常最好的做法是将其用引号引起来,除非您特别希望将其视为几个独立的参数。