我如何知道Bash中是否设置了变量?
例如,如何检查用户是否将第一个参数提供给函数?
function a {
# if $1 is set ?
}
Run Code Online (Sandbox Code Playgroud) 我希望我的脚本能够获取可选输入,
例如,目前我的剧本是
#!/bin/bash
somecommand foo
Run Code Online (Sandbox Code Playgroud)
但我想说:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Run Code Online (Sandbox Code Playgroud) 我有一个package.json,脚本键中包含以下(简化)内容:
...
scripts: {
"start": "NODE_ENV=${NODE_ENV:=production} node start-app.js",
"poststart": "echo $NODE_ENV"
}
...
Run Code Online (Sandbox Code Playgroud)
从命令行我可以运行:
npm start
Run Code Online (Sandbox Code Playgroud)
这将运行我的start-app.js脚本并将process.env.NODE_ENV环境变量设置为"production".请参阅此处获取语法说明.
如上所述启动后会自动开始运行后这里.
但是,poststart不会"继承"NODE_ENV shell环境变量,因此echo命令不会回显任何内容.
我的生产代码有点复杂,但我想要完成的是将NODE_ENV变量从"起点"传递给依赖脚本.关于如何做的任何建议/最佳实践?
我不想在poststart中硬编码NODE_ENV,因为我可能想要:
NODE_ENV=development npm start
Run Code Online (Sandbox Code Playgroud)
我希望每一个"沿着链条"继承同样的环境.
我最近发现,它可能有猛砸设置一个变量时变量未设置(如中描述的默认值这个职位).
不幸的是,当默认值是数组时,这似乎不起作用.作为一个例子考虑,
default_value=(0 1 2 3 4)
my_variable=${my_variable:=("${default_value[@]}")}
echo ${my_variable[0]}
(0 a 2 3 4) #returns array :-(
echo ${my_variable[1])
#returns empty
Run Code Online (Sandbox Code Playgroud)
有谁知道这是怎么回事?请注意,更改:=为:-没有帮助.
另一个问题是,我们获得的任何解决方案也应该在my_variable事先已经设置的情况下工作,这样做
my_variable=("a" "b" "c")
default_value=(0 1 2 3 4)
my_variable=${my_variable:=("${default_value[@]}")}
echo ${my_variable[0]}
"a"
echo ${my_variable[1]}
"b"
echo ${my_variable[2]}
"c"
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法,仅当环境变量之前未设置为任何值(甚至是空字符串)时,才将 Bash 脚本中导出的环境变量设置为脚本中字面指定的默认值,并执行此操作无需在解决此任务的代码中多次提及环境变量的名称。
\n\n请注意,此处和此处的解决方案(使用${FOO:=42})不适用,因为它们仅设置 shell 变量,而不是导出的环境变量。我不想为单个命令设置它;我想为来自同一 shell 的所有命令设置它。
另请注意,类似
\n\nexport FOO="${FOO:-42}"\nRun Code Online (Sandbox Code Playgroud)\n\n也没有回答这个问题,因为它FOO在解决方案中提到了两次。
我意识到这个问题有一个简单的技术替代解决方案 \xe2\x80\x94 只需使用两次提到变量名称的解决方案。明确地说,“不,这是不可能的”是对这个问题的合理答案,如果它确实不可能,并且如果两次提及该变量不是问题,那么这些替代方案是完全可以的,所以它\这是一个稍微人为的问题(我只关心这个以使编辑脚本稍微更加干净和容易)。
\nDocker 正在使用我的 .env 文件中的变量,我不断收到错误消息:
未处理的拒绝 SequelizeConnectionError:角色“eli”不存在
我希望 Postgres 从设置的环境中获取变量 docker-compose.yml
.env
POSTGRES_PORT=5432
POSTGRES_DB=elitest4
POSTGRES_USER=eli
POSTGRES_PASSWORD=
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml
# docker-compose.yml
version: "3"
services:
app:
build: .
depends_on:
- database
ports:
- 8000:8000
environment:
- POSTGRES_HOST=database
env_file:
- .env
database:
image: postgres:9.6.8-alpine
environment: # postgress should be getting these variables, not the variables set in the env file thats for localhost
POSTGRES_PASSWORD: password
POSTGRES_USER: user
POSTGRES_DB: db
volumes:
- pgdata:/var/lib/postgresql/pgdata
ports:
- 8002:5432
env_file:
- .env
react_client:
build:
context: ./client
dockerfile: Dockerfile
image: …Run Code Online (Sandbox Code Playgroud) 我知道我能做到:
echo ${var:-4}
Run Code Online (Sandbox Code Playgroud)
打印4如果var为null,
但-n在这种情况下如何分配..?
echo ${var:--n} 不起作用.
虽然这确实有效..
echo ${var:---n}
Run Code Online (Sandbox Code Playgroud)
但在那种情况下它打印出来--n,我需要它打印-n.
TOKEN=$(if [[ $TOKEN ]] then echo $TOKEN else cat ./cloud/token fi)
Run Code Online (Sandbox Code Playgroud)
所以我试图设置变量TOKEN。这可能是之前设置的,在这种情况下,我希望使用该值,如果没有,我希望通过捕获文件来分配它。
上面的方法不起作用,因为我缺乏 bash 技能!
如何以简洁,惯用的方式为bash变量设置默认值?这看起来很难看:
if [[ ! -z "$1" ]]; then
option="$1"
else
option="default"
fi
Run Code Online (Sandbox Code Playgroud) 我有一堆从客户端代码传递的环境变量,如果没有设置它们,我需要为它们设置默认值。
除了用大量的方法一一测试它们之外if ...; then ... fi,还有一种干净的方法可以做到这一点吗?