linux shell 变量命令,shell - 如何在Bash中将变量设置为命令的输出?

我用来从命令设置变量的一些bash技巧

第二次编辑2018-02-12:添加一种特殊的方式,请看这个底部!

2018-01-25编辑:添加示例函数(用于填充有关磁盘使用情况的变量)

第一个简单的旧和兼容的方式

myPi=`echo '4*a(1)' | bc -l`

echo $myPi

3.14159265358979323844

大多数兼容,第二种方式

由于嵌套可能变得很重,因此实现了括号

myPi=$(bc -l <<

嵌套样本:

SysStarted=$(date -d "$(ps ho lstart 1)" +%s)

echo $SysStarted

1480656334

读取多个变量(用bashisms)

df -k /

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/dm-0 999320 529020 401488 57% /

如果我只想要使用值:

array=($(df -k /))

你可以看到数组变量:

declare -p array

declare -a array='([0]="Filesystem" [1]="1K-blocks" [2]="Used" [3]="Available" [

4]="Use%" [5]="Mounted" [6]="on" [7]="/dev/dm-0" [8]="999320" [9]="529020" [10]=

"401488" [11]="57%" [12]="/")'

然后:

echo ${array[9]}

529020

但我更喜欢这个:

{ read foo ; read filesystem size used avail prct mountpoint ; } <

echo $used

529020

1st myBc将跳过标题行(变量6将包含类似Filesystem 1K-blocks Used Available Use% Mounted on的内容)

用于填充一些变量的示例函数:

#!/bin/bash

declare free=0 total=0 used=0

getDiskStat() {

local foo

{

read foo

read foo total used free foo

} <

df -k ${1:-/}

)

}

getDiskStat $1

echo $total $used $free

Nota:myBc行不是必需的,只是为了便于阅读。

关于myBc

shell=$(cat /etc/passwd | grep $USER | cut -d : -f 7)

echo $shell

/bin/bash

(请避免无用myBc!所以这只是1叉少:

shell=$(grep $USER

所有管道(myBc)均表示叉子。 必须运行另一个进程,访问磁盘,库调用等等。

所以使用myBc作为示例,将子进程限制为只有一个fork:

shell=$(sed

echo $shell

和bashisms:

但对于许多操作,主要是小文件,bash可以自己完成这项工作:

while IFS=: read -a line ; do

[ "$line" = "$USER" ] && shell=${line[6]}

done

echo $shell

/bin/bash

要么

while IFS=: read loginname encpass uid gid fullname home shell;do

[ "$loginname" = "$USER" ] && break

done

echo $shell $loginname ...

进一步讨论变量分裂......

看看我的回答如何在Bash中的分隔符上拆分字符串?

替代方案:通过使用后台长时间运行的任务来减少分叉

第二编辑2018-02-12:为了防止像多个叉子一样

myPi=$(bc -l <<

myRay=12

myCirc=$(bc -l <<

要么

myStarted=$(date -d "$(ps ho lstart 1)" +%s)

mySessStart=$(date -d "$(ps ho lstart $$)" +%s)

因为myBc和6可以逐行工作:

bc -l <<

12

30

date -f - +%s <

1516030449

1517853288

我们可以使用长时间运行的后台进程重复创建作业,而不必为每个请求启动新的fork:

mkfifo /tmp/myFifoForBc

exec 5> >(bc -l >/tmp/myFifoForBc)

exec 6

rm /tmp/myFifoForBc

(当然,FD myBc和6必须未使用!)...从那里,您可以通过以下方式使用此过程:

echo "3*4" >&5

read -u 6 foo

echo $foo

12

echo >&5 "pi=4*a(1)"

echo >&5 "2*pi*12"

read -u 6 foo

echo $foo

75.39822368615503772256

进入功能myBc

您可以在GitHub.Com或我自己的网站上找到我的myBc功能(在github上有Nota,我的网站上有两个文件,功能和演示被捆绑到一个文件中,可以使用或只运行演示)

样品:

. shell_connector.sh

tty

/dev/pts/20

ps --tty pts/20 fw

PID TTY STAT TIME COMMAND

29019 pts/20 Ss 0:00 bash

30745 pts/20 R+ 0:00 \_ ps --tty pts/20 fw

newConnector /usr/bin/bc "-l" '3*4' 12

ps --tty pts/20 fw

PID TTY STAT TIME COMMAND

29019 pts/20 Ss 0:00 bash

30944 pts/20 S 0:00 \_ /usr/bin/bc -l

30952 pts/20 R+ 0:00 \_ ps --tty pts/20 fw

declare -p PI

bash: declare: PI: not found

myBc '4*a(1)' PI

declare -p PI

declare -- PI="3.14159265358979323844"

函数myBc允许您使用简单语法的后台任务,并使用日期:

newConnector /bin/date '-f - +%s' @0 0

myDate '2000-01-01'

946681200

myDate "$(ps ho lstart 1)" boottime

myDate now now ; read utm idl

myBc "$now-$boottime" uptime

printf "%s\n" ${utm%%.*} $uptime

42134906

42134906

ps --tty pts/20 fw

PID TTY STAT TIME COMMAND

29019 pts/20 Ss 0:00 bash

30944 pts/20 S 0:00 \_ /usr/bin/bc -l

32615 pts/20 S 0:00 \_ /bin/date -f - +%s

3162 pts/20 R+ 0:00 \_ ps --tty pts/20 fw

从那里,如果你想结束一个后台进程,你只需要关闭他的fd:

eval "exec $DATEOUT>&-"

eval "exec $DATEIN>&-"

ps --tty pts/20 fw

PID TTY STAT TIME COMMAND

4936 pts/20 Ss 0:00 bash

5256 pts/20 S 0:00 \_ /usr/bin/bc -l

6358 pts/20 R+ 0:00 \_ ps --tty pts/20 fw

不需要,因为所有fd在主要过程结束时关闭。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值