相关疑难解决方法(0)

Bash 中的“声明”是什么?

在阅读了 ilkkachu 对这个问题的回答后,我了解到内置的declare(带参数-n)shell的存在。

help declare 带来:

设置变量值和属性。

声明变量并赋予它们属性。如果没有给出名称,则显示所有变量的属性和值。

-n ... 使 NAME 成为对其值命名的变量的引用

我要求用一个例子declare做一个一般性的解释,因为我不理解man. 我知道什么是变量和扩大,但我还是错过了mandeclare(可变属性?)。

也许您想根据 ilkkachu 在答案中的代码来解释这一点:

#!/bin/bash
function read_and_verify  {
    read -p "Please enter value for '$1': " tmp1
    read -p "Please repeat the value to verify: " tmp2
    if [ "$tmp1" != "$tmp2" ]; then
        echo "Values unmatched. Please try again."; return 2
    else
        declare -n ref="$1"
        ref=$tmp1
    fi
}
Run Code Online (Sandbox Code Playgroud)

bash function shell-builtin control-flow declare

24
推荐指数
4
解决办法
1万
查看次数

ksh93 中的排版未按预期工作

我认为typesetksh's local,但这失败了,ksh93 尽管它适用于我所有其他typeset支持的 shell(bash、yash、zsh、pdksh)

#!/bin/ksh -ex

foo(){
    typeset a b
    a=0; b=1
    return
}
a=a; b=b
foo
#confirm that the globals didn't change
[ "$a" = a ] 
[ "$b" = b ]
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?

shell ksh typeset

6
推荐指数
1
解决办法
1713
查看次数

bash vs zsh:范围和`typeset -g`

来自https://unix.stackexchange.com/a/381782/674

例如:

integer() { typeset -gi "$1"; }
Run Code Online (Sandbox Code Playgroud)

为了使变量的整数工作mksh/ yash/ zsh。它bash仅适用于未被调用者声明为本地的变量:

$ bash -c 'f() { declare a; integer a; a=1+1; echo "$a"; }; integer() { typeset -gi "$1"; }; f'
1+1
$ bash -c 'f() { integer a; a=1+1; echo "$a"; }; integer() { typeset -gi "$1"; }; f'
2
Run Code Online (Sandbox Code Playgroud)

请注意,export var既不是 也不typeset -x vartypeset -gx varexport如果变量已经存在,它会在不声明新变量的情况下添加属性。readonlyvs相同typeset -r。 …

bash zsh

6
推荐指数
1
解决办法
2575
查看次数

取消设置有什么作用?

我试图了解以下部分:unsethttps ://unix.stackexchange.com/a/381782/674

unsetbash 当变量已在当前作用域中声明时才取消设置该变量尽管在全局作用域中除外,但仍保留其声明;它删除属性和值,并且该变量不再是数组或散列;另请注意,在 namerefs 上,它取消设置引用的变量)多变的)。否则,它只是从上面提到的堆栈中弹出一个变量层。

Bash手册没有提到任何相关的内容,或者我错过了。

你能用例子解释一下吗

  • “仅取消设置已在当前作用域中声明的变量”
  • “尽管在全局范围内除外,但仍保留其声明”。

    如果unset变量位于函数的局部作用域中,那么该unset变量不仅未设置而且未声明吗?

    如果unset变量位于全局范围内,该unset变量是否只是未设置但仍已声明?

    如何检查变量是否已声明?

  • “否则,它只会从上面提到的堆栈中弹出一个变量层。”

    “否则”和“一个变量层”是什么意思?

谢谢。

bash

6
推荐指数
1
解决办法
2万
查看次数

标签 统计

bash ×3

control-flow ×1

declare ×1

function ×1

ksh ×1

shell ×1

shell-builtin ×1

typeset ×1

zsh ×1