0

I made a simple script on WSL for windows 11 to mount my pen drive. The default option is to mount it from D:, and I can specify as an argument if the pen drive is in another place.

The script is like this:

#! /bin/bash [[ $# -eq 0 ]] && sudo mount -t drvfs D: /pen || sudo mount -t drvfs ${1}: /pen [[ $? == 0 ]] && echo "Good" || echo "Bad" 

It works when the pen drive is connected on port D:, but when there is no pen drive connected, the first command executes both sides of the OR.

I am expecting it to execute on the same basis of al if-else statement. If the condition is true, it executes the left side, and if it is false, it executes the right side.

11
  • 3
    The && ... || trick is not equivalent to an if ... then ... else ... fi. Don't use it, it just doesn't work. See BashPitfalls #22 and "Can't increment variable in bash shorthand if else condition". Commented May 31, 2023 at 9:30
  • 1
    I would just use if...else at this point, but if you insist on keeping this form, you can do: A && { B; true; } || C Commented May 31, 2023 at 10:13
  • 5
    Actually, in this case you could skip the conditional entirely, and use an alternate value substitution to make "D" the default parameter: sudo mount -t drvfs "${1:-D}:" /pen Commented May 31, 2023 at 10:14
  • 1
    @Pau: Of course you can always write a normal if....fi into a single line, if you want. Statements are separated by either newlines or semicolons. Commented May 31, 2023 at 11:19
  • 1
    Just remember that A && B || C does not equal if A then B else C fi, it equals if A then if ! B then C fi; else C fi. Commented May 31, 2023 at 12:36

1 Answer 1

2

This construction (so called one-line if statement) uses executable part as a condition assuming that it's true. But if "true" part returns false, second part will also be executed.

Here's the example:

[[ 0 == 0 ]] && (echo "Good"; exit 1) || echo "Bad" 

Condition is true, but executable part after it returns false (exit 1), so [[ 0 == 0 ]] && (echo "Good"; exit 1) part is false and we should check another condition of || operator.

As a result, we are executing both true and false parts.

If you need to fit it into a single line, you can add || true to "true" part:

[[ 0 == 0 ]] && (echo "Good" || true) || echo "Bad" 

In this case, even if echo "Good" returns false, the whole "true" part will return true and false second part of || will not be checked.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.