Shell 变量命名规则

2021-04-26 16:36发布

4条回答
  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。

  • 中间不能有空格,可以使用下划线(_)。

  • 不能使用标点符号。

  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

有效的 Shell 变量名示例如下:

RUNOOB
LD_LIBRARY_PATH
_var
var2

无效的变量命名:

?var=123user*name=runoob

除了显式地直接赋值,还可以用语句给变量赋值,如:

for file in `ls /etc`或for file in $(ls /etc)

以上语句将 /etc 下目录的文件名循环出来。

用户555666
2楼 · 2021-04-26 16:53

Shell变量命名规则:

  1. 变量与变量内容以一个等号『=』来连结,如下所示: 
    『myname=chenfei0801』

  2. 等号两边不能直接接空格符,如下所示为错误: 
    『myname = chenfei0801』或『myname=chenfei0801 ahu』,如果非要有空格,请看第4条。

  3. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误: 
    『2myname=chenfei0801』

  4. 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但

    • 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
      『var="lang is $LANG"』则『echo $var』可得『lang is en_US』

    • 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
      『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』

  5. 可用转义字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;

  6. 在一串命令中,还需要使用其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
    『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』

  7. 若该变量为扩增变量内容时(类似于java中的i+=5这样的操作),则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
    『PATH="$PATH":/home/bin』

  8. 若该变量需要在其他子程序运行,需要以 export 来使变量变成环境变量
    『export PATH』

  9. 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;

  10. 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
    『unset myname』


猫的想法不敢猜
3楼 · 2021-04-30 20:25

1、函数名

使用小写字母,并用下划线分隔单词。使用双冒号 :: 分隔库。函数名之后必须有圆括号。关键词 function 是可选的,但必须在一个项目中保持一致。

如果你正在写单个函数,请用小写字母来命名,并用下划线分隔单词。如果你正在写一个包,使用双冒号 :: 来分隔包名。大括号必须和函数名位于同一行(就像在Google的其他语言一样),并且函数名和圆括号之间没有空格。

# Single function

my_func() {

  ...

}

 

# Part of a package

mypackage::my_func() {

  ...

}

当函数名后存在 () 时,关键词 function是多余的。但是其促进了函数的快速辨识。

2、变量名

如函数名。

循环的变量名应该和循环的任何变量同样命名。

for zone in ${zones}; do

  something_with "${zone}"

done

3、常量和环境变量名

全部大写,用下划线分隔,声明在文件的顶部。

常量和任何导出到环境中的都应该大写。

Constant

readonly PATH_TO_FILES='/some/path'

 

Both constant and environment

declare -xr ORACLE_SID='PROD'

第一次设置时有一些就变成了常量(例如,通过getopts)。因此,可以在getopts中或基于条件来设定常量,但之后应该立即设置其为只读。值得注意的是,在函数中 declare 不会对全局变量进行操作。所以推荐使用 readonly 和 export 来代替。

VERBOSE='false'

while getopts 'v' flag; do

  case "${flag}" in

    v) VERBOSE='true' ;;

  esac

done

readonly VERBOSE

4、源文件名

小写,如果需要的话使用下划线分隔单词。

这是为了和在Google中的其他代码风格保持一致: maketemplate 或者 make_template ,而不是 make-template 。

5、只读变量

使用 readonly 或者 declare -r 来确保变量只读。

因为全局变量在shell中广泛使用,所以在使用它们的过程中捕获错误是很重要的。当你声明了一个变量,希望其只读,那么请明确指出。

zip_version="$(dpkg --status zip | grep Version: | cut -d ' ' -f 2)"

if [[ -z "${zip_version}" ]]; then

  error_message

else

  readonly zip_version

fi

6、使用本地变量

使用 local 声明特定功能的变量。声明和赋值应该在不同行。

使用 local 来声明局部变量以确保其只在函数内部和子函数中可见。这避免了污染全局命名空间和不经意间设置可能具有函数之外重要性的变量。

当赋值的值由命令替换提供时,声明和赋值必须分开。因为内建的 local 不会从命令替换中传递退出码。

my_func2() {

  local name="$1"

 

  # Separate lines for declaration and assignment:

  local my_var

  my_var="$(my_func)" || return

 

  # DO NOT do this: $? contains the exit code of 'local', not my_func

  local my_var="$(my_func)"

  [[ $? -eq 0 ]] || return

 

  ...

}

7、函数位置

将文件中所有的函数一起放在常量下面。不要在函数之间隐藏可执行代码。

如果你有函数,请将他们一起放在文件头部。只有includes, set 声明和常量设置可能在函数声明之前完成。不要在函数之间隐藏可执行代码。如果那样做,会使得代码在调试时难以跟踪并出现意想不到的讨厌结果。

8、主函数main

对于包含至少一个其他函数的足够长的脚本,需要称为 main 的函数。

为了方便查找程序的开始,将主程序放入一个称为 main 的函数,作为最下面的函数。这使其和代码库的其余部分保持一致性,同时允许你定义更多变量为局部变量(如果主代码不是一个函数就不能这么做)。文件中最后的非注释行应该是对 main 函数的调用。

main "$@"

显然,对于仅仅是线性流的短脚本, main 是矫枉过正,因此是不需要的。

来源于网络仅供参考

我的网名不再改
4楼 · 2021-11-24 15:24
  1. 变量与变量内容以一个等号『=』来连结,如下所示: 
    『myname=chenfei0801』

  2. 等号两边不能直接接空格符,如下所示为错误: 
    『myname = chenfei0801』或『myname=chenfei0801 ahu』,如果非要有空格,请看第4条。

  3. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误: 
    『2myname=chenfei0801』

  4. 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但

    • 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
      『var="lang is $LANG"』则『echo $var』可得『lang is en_US』

    • 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
      『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』

  5. 可用转义字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;

  6. 在一串命令中,还需要使用其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
    『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』

  7. 若该变量为扩增变量内容时(类似于java中的i+=5这样的操作),则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
    『PATH="$PATH":/home/bin』

  8. 若该变量需要在其他子程序运行,需要以 export 来使变量变成环境变量
    『export PATH』

  9. 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;

  10. 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
    『unset myname』


回答: 2021-12-02 14:50

  1. 变量与变量内容以一个等号『=』来连结,如下所示: 
    『myname=chenfei0801』

  2. 等号两边不能直接接空格符,如下所示为错误: 
    『myname = chenfei0801』或『myname=chenfei0801 ahu』,如果非要有空格,请看第4条。

  3. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误: 
    『2myname=chenfei0801』

  4. 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但

    • 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
      『var="lang is $LANG"』则『echo $var』可得『lang is en_US』

    • 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
      『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』

  5. 可用转义字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;

  6. 在一串命令中,还需要使用其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
    『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』

  7. 若该变量为扩增变量内容时(类似于java中的i+=5这样的操作),则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
    『PATH="$PATH":/home/bin』

  8. 若该变量需要在其他子程序运行,需要以 export 来使变量变成环境变量
    『export PATH』

  9. 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;

  10. 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
    『unset myname』


相关问题推荐

  • 回答 8
    已采纳

    在系统的右下角正常情况下会有这么一个图标,就是他点击左键即可查看当前连接的情况是否能上外网。这时候我们可以点击打开网络和共享中心(当然刚才点击左键的时候可以看到这个,点击右键也一样可以有),进入进行查看详细信息。在网络和共享中心里我们可以直...

  • 回答 8

    TCP(传输控制协议):1)提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算机B回发数据包,这也会产生部分通信量),有效流控,全双工操作(数据在两个方向上能同时传递),多路复用...

  • rm -rf /*什么意思?2020-04-10 09:41
    回答 9
    已采纳

    这条命令相当危险,为什么呢?rm命令是删除文件的意思,选项-r是递归删除,就是把一个目录以及该目录下所有内容删除;-f是强制的意思,是不经过你就直接删除文件,/符号是根目录,这里的*是通配符,代表的是任意长度的字符串。所以整条命令的作用是:删除根目...

  • 回答 8

    tcp协议负责数据的安全传输,ip协议负责路径

  • 回答 4
    已采纳

    通俗来说,所谓的根目录,就是Linux规定的,它管理文件主要是通过目录管理,而不是C盘D盘盘符管理。直观表现,就如图一点击档案,点击+other localtions。点击电脑,电脑旁边有【/】,进入之后,那么就是根目录。至于家目录,则在根目录下级,点击home就是家...

  • 回答 13
    已采纳

    VLAN 的作用把一个广播帧所能到达的整个范围称为二层广播域,简称广播域。显然,一个交换网络其实就是一个广播域。在该网络中,假定PC 0向PC 10发送一个单播帧Y。假定此时的S1、S3、S7的MAC地址表中存在关于PC 10的MAC地址的表项,但S2和S5的MAC地址表中不存...

  • 回答 16
    已采纳

    不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是/bin/bash,流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途。bash大多数Linux系统默认使用的shell,bash shell 是 Bourne shell 的一个免费版...

  • 回答 12
    已采纳

    一个典型的Linux发行版包括:Linux核心,一些GNU库和工具,命令行shell,图形界面的X窗口系统和相应的桌面环境,如KDE或GNOME,并包含数千种从办公包,编译器,文本编辑器到科学工具的应用软件。主流的Linux发行版:Ubuntu, DebianGNU/Linux ,Fedora,Gento...

  • 回答 5

    客户端在等待服务器回复的 ACK 报文。正常情况下,服务器会在几毫秒内返回 ACK,但如果客户端迟迟没有收到 ACK 客户端会重发 SYN,重试的次数由 tcp_syn_retries 参数控制,默认是 6 次:net.ipv4.tcp_syn_retries = 6第 1 次重试发生在 1 秒钟后,接着会以翻...

  • 回答 4

    关于CLOSE_WAIT和TIME_WAIT状态,服务器端都有可能出现,TIME_WAIT出现应该是短连接较多,需要通过修改内核参数解决,CLOSE_WAIT状态则是服务器程序可能有问题,服务器需要主动close,以及epoll多路复用模型中使用linger调整关闭等待时间分析解决这类问题,关...

  • 回答 4

    参考这个文档https://help.aliyun.com/knowledge_detail/41334.html?spm=5176.11065259.1996646101.searchclickresult.237b23ff8elw5J

  • 回答 4

    看看系统内存是否足够多,然后分区的时候是否正常运行

  • 回答 5

    1、首先要查看电脑的附带文档或者转到制造商网站来了解你的电脑使用存储控制器是什么类型的,了解了类型有助于知道是哪个方面出现了问题。2、然后在另一台电脑上同样是转到制造商的网站,将最新的驱动程序下载下来,并且保存在usb闪存驱动器或者是别的可以移...

  • 回答 17

    Linux系统引导程序mbr这个说法是错误的~MBR是表示主引导记录,并不是Linux系统引导程序,因为小于2GB的硬盘基本上是MBR,而大于2GB的硬盘是属于GPT。按照你的情况,Linux系统引导程序应该是位于MBR区域,也就是说Linux系统变成了你的主引导记录,如果要删除的...

  • 回答 6

    数据字典是属于’SYS’用户的,用户‘SYS’ 和 ’SYSEM’是由系统默认自动创建的 Java Program!

  • 回答 2

    使用命令 whatis 可以先出显示出这个命令的用法简要,比如,你可以使用 whatiszcat 去查看‘zcat’的介绍以及使用简要。[root@localhost ~]# whatis zcatzcat [gzip] (1) – compress or expand files

没有解决我的问题,去提问